一、文件署名域
8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值是:
十进制数 | 十六进制数 |
---|---|
137 80 78 71 13 10 26 10 | 89 50 4E 47 0D 0A 1A 0A |
以一张3*3png文件为例说明:
二、数据块结构
PNG图像格式文件由一个8字节的PNG文件署名域和按照特定结构组织的3个以上的数据块(chunk)组成。
数据块又分为两种类型,关键数据块和辅助数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们。
数据块的4个域组成如下:
框选的第一部分表示chunk长度,十进制是13
框选的第二部分chunk标识,IHDR标识
框选的第三部分是chunk数据部分
框选的第四部分和第五部分是CRC校验码
结构体如下:
class Chunk
{
public:
DWORD ChunkLen;//ChunkLen 不算 ChunkLen,Tag,CRC的长度
DWORD Tag;//4byte
DWORD CRC;效验码
};
class IHDR : public Chunk
{
public:
DWORD Width;//宽
DWORD Height;//高
BYTE BitDepth;//位深 真彩色图像:8或16
BYTE ColorType;//颜色类型 6:带α通道数据的真彩色图像,8或16
BYTE CompressionMethod;//压缩方法(LZ77派生算法) 固定0
BYTE FilterMethod;//滤波器方法 固定0
BYTE InterlaceMethod;//隔行扫描方法:0:非隔行扫描 1: Adam7(由Adam M.Costello开发的7遍隔行扫描方法)
};
如下图框选部分:
前八位表示3*3格式,位深是8位,颜色类型2,压缩方法、滤波器方法、隔行扫描方法都是0
00 00 00 27(16):表示调色板数据长度为39
PLTE:调色板数据块,该数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成。
49 44 41 54 :PLTE标识
上图框选的数据是:
图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
由于数据采用了LZ77派生算法,所以不能直接看出对应的数据。
F1 6B 03 EA 是CRC校验码
这是IEND数据块,通常都是这样。