图片头文件解析

各种类型的图片头文件解析

1.PNG图片文件头

1.1PNG文件结构

PNG图像格式文件由一个8字节的PNG文件标识(file signature)域和3个以上的后续数据块(IHDR、IDAT、IEND等)组成。
PNG文件包括8字节文件署名(89 50 4E 47 0D 0A 1A 0A,十六进制),用来识别PNG格式。

十六进制含义
89用于检测传输系统是否支持8位的字符编码(8 bit data),用以减少将文本文件被错误的识别成PNG文件的机会,反之亦然。
50 4E 47PNG每个字母对应的ASCII,让用户可以使用文本编辑器查看时,识别出是PNG文件。
0D 0ADOS风格的换行符(CRLF)。用于DOS-Unix数据的换行符转换。
1A在DOS命令行下,用于阻止文件显示的文件结束符。
0AUnix风格的换行符(LF)。用于Unix-DOS换行符的转换。

1.2PNG数据块(chunk)

PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。
关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。
下表就是PNG中数据块的类别,其中,关键数据块部分我们使用红色背景加以区分。

数据块符号 数据块名称 多数据块 可选否 位置限制


  IHDR           文件头数据块           否        否           第一块
  cHRM        基色和白色点数据块        否        是      在PLTE和IDAT之前
  gAMA           图像γ数据块            否        是      在PLTE和IDAT之前
  sBIT         样本有效位数据块         否        是      在PLTE和IDAT之前
  PLTE           调色板数据块           否        是         在IDAT之前
  bKGD          背景颜色数据块          否        是     在PLTE之后IDAT之前
  hIST         图像直方图数据块         否        是     在PLTE之后IDAT之前
  tRNS          图像透明数据块          否        是     在PLTE之后IDAT之前
  oFFs         (专用公共数据块)         否        是         在IDAT之前
  pHYs        物理像素尺寸数据块        否        是         在IDAT之前
  sCAL         (专用公共数据块)         否        是         在IDAT之前
  IDAT            图像数据块            是        否       与其他IDAT连续
  tIME      图像最后修改时间数据块      否        是           无限制
  tEXt          文本信息数据块          是        是           无限制
  zTXt          压缩文本数据块          是        是           无限制
  fRAc         (专用公共数据块)         是        是           无限制
  gIFg         (专用公共数据块)         是        是           无限制
  gIFt         (专用公共数据块)         是        是           无限制
  gIFx         (专用公共数据块)         是        是           无限制
  IEND           图像结束数据           否        否       最后一个数据块