PNG格式文件分析
PNG文件格式简介
PNG是图像文件存储格式,其目的是试图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性,因为它压缩比高、生成文件容量小,所以一般应用于JAVA程序网页或S60程序中;可以用PS软件和电脑自带画图软件导出png格式。
PNG文件头
PNG数据块
在PNG文件中,每个数据块都由四部分组成
名称 | 字节数 | 说明 |
Length(长度) | 4 | 指定数据块中数据域的长度 |
Chunk Type Code(数据块类型码) | 4 | 由ASCII 码字母组成 |
Chunk Data(数据块数据) | 可变,但应与length值相等 | 存储按照Chunk Type Code指定的数据 |
CRC(循环冗余检测) | 4 | 存储用来检测是否有错误的循环冗余码 |
PNG定义了两种类型的数据块
一:关键数据块(critical chunk),这是标准的数据块;
二:辅助数据块(ancillary chunk),这是可选的数据块. 关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们。
关键数据块:
IHDR(header chunk) | 包含有图像基本信息,作为第一个出现的数据块并且只出现一次。 |
PLTE(palette chunk) | 调色板数据块,必须存放在图像数据块之前。 |
IDAT(image data chunk) | 存储实际的图像数据。PNG数据包允许包含多个连续的图像数据块。 |
IEND(image trailer chunk) | 图像结束数据,表示PNG数据流结束。 |
辅助数据块
1.背景颜色数据块bKGD(background color)。
2.基色和白色度数据块cHRM(primary chromaticities and white point)。
3.图像γ数据块gAMA(image gamma)。
4.图像直方图数据块hIST(image histogram)。
5.物理像素尺寸数据块pHYs(physical pixel dimensions)。
6.样本有效位数据块sBIT(significant bits)。
7.文本信息数据块tEXt(textual data)。
8.图像最后修改时间数据块tIME (image last-modification time)。
9.图像透明数据块tRNS (transparency)。
10.压缩文本数据块zTXt (compressed textual data)。
IHDR数据块
它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。文件头数据块由13字节组成
域名 | 字节数 | 说明 |
width | 4 | 图像宽度,以像素为单位 |
Height | 4 | 图像高度,以像素为单位 |
Bit depth | 1 | 图像深度: 索引彩色图像:1,2,4或8 灰度图像:1,2,4,8或16 真彩色图像:8或16 |
ColorType | 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. Costello开发的7 |
PLTE数据块
调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。
PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:
颜色 | 字节数 | 说明 |
red | 1 | 0 = 黑 255 = 红 |
green | 1 | 0 = 黑 255 = 绿 |
blue | 1 | 0 = 黑 255 = 蓝 |
IDAT数据块
它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
IEND数据块
它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。