png是一种采用无损压缩算法的位图格式,其设计目的是试图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。 

一  PNG文件结构

PNG文件由文件署名域(8字节)和最少3个数据块(Chunk)按照特定的顺序排列而成。 

数据块分为两类:

关键数据块(Critical Chunk):必须包含的数据块。

辅助数据块(Ancillary Chunk):可选的数据块。

png文件署名域 png数据块 png数据块 ....... png数据块

二  PNG文件的标志

8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值如下:

十进制数 137  80  78  71  13  10  26  10
十六进制数 89    50  4E  47  0D  0A  1A  0A

三  PNG文件的数据块

PNG文件有两种类型的数据块。关键数据块(critical chunk)和辅助数据块(ancillary chunks)。每个数据块由4个部分组成。

名称 字节数 说明
Length 4 指定数据块中数据域的长度,其长度不超过(2^31-1)字节
Chunk Type code 4 数据块类型码,由ASC||字母(A~Z)(a~z)组成
Chunk Data 可变 存储按照Chunk Type Code指定的数据
CRC 4 存储用来检测是否有错误的循环冗余码

1.关键数据块有:

(1)文件头数据块IHDR(header chunk)

包含PNG文件里存储的图像数据的基本信息,作为第一个数据块出现在PNG数据流中,一个PNG数据流有且仅有一个文件头数据块。IHDR数据块的Chunk type code:0x49 48 44 52(ASCII码“IHDR”),标识该块类型

域的名称 字节数 说明
width 4 图像宽度
height 4 图像高度
bit depth 1

图像深度:

索引彩色图像:1,2,4或8

灰度图像:1,2,,4,8或16

真彩色图像:8或16

color type 1

颜色类型:

0:灰度图像,1,2,4,8或16

2:真彩色图像,8或16

3:索引彩色图像,1,2,4或8

4:带α通道数据的灰度图像,8或16

6:带α通道数据的真彩色图像,8或16

compression method 1 压缩方法(LZ77派生算法)
filter method 1 滤波器方法
interlace  method 1

隔行扫描方法:

0:非隔行扫描

1:Adam7(由Adam M.Costell开发的7遍隔行扫描方法)

(2)调色版数据块PLTE(paltte chunk)

它包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,使得图像深度较小的图像,可以使用索引号来正确表示颜色。它要放在图像数据块(image data chunk)之前。PLTEPLTE数据块是定义图像的调色板信息,PLTEPLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:

颜色 字节 意义
Red 1 0:黑         255:红
Green 1 0:黑         255:绿
Blue 1 0:黑         255:蓝

注意PLTE块还必需满足以下限制条件:

1.调色板的长度应为3的倍数,即PLTE块最大字节数为256 × 3 = 768 B;

2.调色板信息的数量不能超过图像深度可以表示的范围

3.对于Colour type 3的PNG图像(索引图像),PLTE块是必需的,此时调色板的颜色索引从0开始编号,然后是1,2……;对于Colour type为2和6的图像,PLTE块是可选的,此时调色板将提供一个1—256的建议颜色集,以便软件或屏幕不支持显示真彩色时量化真彩色图像;Colour type为0和4的图像中不能出现PLTE块。

(3)IDAT

图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。

(4)IEND

图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

值 00 00 00 00 49 45 4E 44 AE 42 60 82

2.辅助数据块

  • 透明信息数据块:tRNS chunk(Transparency chunk)
  • 图像γ数据块:gAMA(Image gamma chunk)
  • 基色和白色度数据块:cHRM(Primary chromaticities chunk)
  • 标准RGB色彩空间数据块:sRGB(Standard RGB colour space chunk)
  • 文本信息数据块:tEXt(Textual data chunk)
  • 压缩文本数据块:zTXt Compressed textual data chunk)
  • 背景颜色数据块:bKGD(Background colour chunk)
  • 物理像素尺寸数据块:pHYs(Physical pixel dimensions chunk)
  • 样本有效位数据块:sBIT(Significant bits chunk)
  • 图像直方图数据块:hIST(Palette histogram chunk)
  • 图像最后修改时间数据块:tIME(Image last-modification time chunk)

 以下详细分析其中几个:   

  1. sRGB

    使用sRGB进行颜色识别和颜色管理。如果存在sRGB块,则图像样本符合sRGB色彩空间[IEC 61966-2-1]。

    sRGB的Chunk Type Code为:115 82 71 66

    sRGB的Chunk data由一个字节组成:

    名称 字节数 说明
    Rendering intent 1 0:Perceptual 适用于喜欢以输出色域为佳,而以色度精度为代价的图像,例如照片。
    1:Relative colorimetric 用于需要颜色外观匹配(相对于输出设备白点)的图像,例如徽标。
    2:Saturation 适用于希望保留饱和度但以色相和亮度为代价的图像,例如图表和图形。
    3:Absolute colorimetric 用于需要保留绝对色度的图像,例如用于其他输出设备的图像预览(校样)。
  2. gAMA,cHEM

    通常在sRGB之后写入gAMA块(以及可选的cHRM块),以便与不使用sRGB块的PNG解码器兼容。当sRGB块存在时,标准建议能对其识别并进行颜色管理的解码器忽略gAMA和cHRM块,而改用sRGB块。

    gAMA块和cHRM块的Chunk data部分:

                     gAMA
    Gamma 45455
                      cHRM                 
    White point x 31270
    White point y 32900
    Red x 64000
    Red y 33000

    Green x

    30000
    Green y 60000
    Blue x 15000
    Blue y 6000
  3. pHYs

    此数据块可表示物理分辨率

Chunk Type Code为:112 72 89 115

pHYs块的Chunk data由三部分构成:

名称 字节数 说明
Pixeis per unit,X axis 4  
Pixeis per unit,Y axis 4  
Unit specifier 1

0:  单位未知

1:单位为米 

实例解析

 以下面这张V.png为例

PNG文件的解析

 PNG文件标志

PNG文件的解析

 文件头数据块IHDR

PNG文件的解析

Length: 00 00 00 0D,与IHDRIHDR IHDRIHDR的13字节对应

Chunk Type Code: 49 48 44 52(ASCII码“IHDR”),标识该块类型

Chunk data部分:

Width:0x00 00 05 DD

Height:0x00 00 04 E5

Bit depth:8,表示8 bit深度

Colour type:6,带α通道数据的真彩色图像

Compression method:0

Filter method:0

Interlace method:0,非隔行扫描

CRC:0x52 F5 7A 8E

图像结束数据块IEND

PNG文件的解析

 sRGB数据块

PNG文件的解析

 Length:00 00 00 01 符合sRGB数据块标准

Chunk Type Code:73 52 47 42 标志sRGB数据块

Rendering intent:00 ,适用于喜欢以输出色域为佳,而以色度精度为代价的图像,例如照片。

CRC:AE CE 1C E9 循环冗余校验码

 gAMA数据块

PNG文件的解析 

 Length:00 00 00 04 符合gAMA数据块标准

Chunk Type Code:67 41 4D 41 标志gAMA数据块

data:00 00 B1 8F

CRC:0B FC 61 05 循环冗余校验码

相关文章: