标签:分析 文件 IDAT 调色板 文件格式 图像 数据 PNG
PNG简介
png是一种无损压缩的位图片形格式。其设计目的是为了替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。
png格式是非失真性压缩的,允许使用类似于GIF格式的调色板技术,支持真彩色图像,并具备阿尔法通道(半透明)等特性。png使用从LZ77派生的无损数据压缩算法,由于它压缩比高,生成文件体积小,一般被应用于JAVA程序、网页或S60程序中。
PNG文件结构
PNG文件一般由两大部分组成:
·8字节的PNG文件署名(PNG file signature)域
·按照特定结构组织的3个以上的数据块(chunk)
标准PNG文件结构
文件署名域 | 数据块 | ······ | 数据块 |
一.文件署名域
作用:用来识别该文件是否为PNG文件
文件头总是用固定的字节来描述的,共8个字节
十进制数 | 十六进制数 |
137 80 78 71 1310 26 10 | 89 50 4E 47 0D 0A 1A 0A |
二.数据块
PNG定义了两种类型的数据块
1.关键数据块(critical chunk),标准的数据块
2.辅助数据块(ancillary chunks),可选的数据块
四种关键数据块
文件头数据块IHDR(header chunk) | 它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。 |
---|---|
调色板数据块PLTE(palette chunk) | 它包含有与索引彩色图像((indexed-color image))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。 |
图像数据块IDAT(image data chunk) | 它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。 |
图像结束数据IEND(image trailer chunk) | 它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。 |
十种辅助数据块
背景颜色数据块bKGD(background color) |
基色和白色度数据块cHRM(primary chromaticities and white point) |
图像γ数据块gAMA(image gamma) |
图像直方图数据块hIST(image histogram) |
物理像素尺寸数据块pHYs(physical pixel dimensions) |
样本有效位数据块sBIT(significant bits) |
文本信息数据块tEXt(textual data) |
图像最后修改时间数据块tIME (image last-modification time) |
图像透明数据块tRNS (transparency) |
压缩文本数据块zTXt (compressed textual data) |
数据块符号 | 数据块名称 | 多数据块 | 可选否 | 位置限制 |
---|---|---|---|---|
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 | 图像结束数据 | 否 | 否 | 最后一个数据块 |
数据块结构
名称 | 字节数 | 说明 |
Length (长度) | 4字节 | 指定数据块中数据域的长度,其长度不超过(231-1)字节 |
Chunk Type Code (数据块类型码) | 4字节 | 数据块类型码由ASCII字母(A-Z和a-z)组成 |
Chunk Data (数据块数据) | 可变长度 | 存储按照Chunk Type Code指定的数据 |
CRC (循环冗余检测) | 4字节 | 存储用来检测是否有错误的循环冗余码 |
关键数据块的结构
IHDR:它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
文件头数据块共有13个字节:
域的名称 | 字节数 | 说明 |
Width | 4 bytes | 图像宽度,以像素为单位 |
Height | 4 bytes | 图像高度,以像素为单位 |
Bit depth | 1 byte | 图像深度: 索引彩色图像:1,2,4或8 灰度图像:1,2,4,8或16 真彩色图像:8或16 |
ColorType | 1 byte | 颜色类型: 0:灰度图像, 1,2,4,8或16 2:真彩色图像,8或16 3:索引彩色图像,1,2,4或8 4:带α通道数据的灰度图像,8或16 6:带α通道数据的真彩色图像,8或16 |
Compression method | 1 byte | 压缩方法(LZ77派生算法) |
Filter method | 1 byte | 滤波器方法 |
Interlace method | 1 byte | 隔行扫描方法: 0:非隔行扫描 1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法) |
PLTE:它包含有与索引彩色图像((indexed-color image))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前
PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:
颜色 | 字节 | 意义 |
Red | 1 byte | 0 = 黑色, 255 = 红 |
Green | 1 byte | 0 = 黑色, 255 = 绿色 |
Blue | 1 byte | 0 = 黑色, 255 = 蓝色 |
因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。
对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4的时候,调色板中的颜色数不可以超过2^4=16),否则,这将导致PNG图像不合法。
真彩色图像和带α通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。
IDAT:图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。
IEND:图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:
00 | 00 | 00 | 00 | 49 | 45 | 4E | 44 | AE | 42 | 60 | 82 |
不难明白,由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。
实例分析
使用visual studio 二进制编辑器打开png格式文件
文件头
前8个字节为
89 | 50 | 4E | 47 | 0D | 0A | 1A | 0A |
IHDR
域的名称 | 字节数 | 实例数据 | 说明 |
Length | 4 bytes | 数据块长度为13 | |
Chunk Type Code | 4 bytes | IHDR标识 | |
width | 4 bytes | 宽度为33795像素 | |
Height | 4 bytes | 高度为32513像素 | |
Bit depth | 1 byte | 图像深度为8位 | |
ColorType | 1 byte | 颜色类型为6,即带α通道数据的真彩色图像 | |
Compression method | 1 byte | 无压缩 | |
Filter method | 1 byte | 无滤波 | |
Interlace method | 1 byte | 非隔行扫描 | |
CRC | 4 bytes | 循环冗余码 |
pHYs
名称 | 实际结果 | 说明 |
Length | 数据块长度为9 | |
Chunk Type Code | 数据块类型为pHYs | |
Chunk Data | 实际数据 |
IDAT
名称 | 实际结果 | 说明 |
Length | 数据块长度为8192 | |
Chunk Type Code | 数据块类型为IDAT | |
Chunk Data | 实际数据 |
IEND
与上描述一致
参考文献
[1]PNG文件分析
标签:分析,文件,IDAT,调色板,文件格式,图像,数据,PNG 来源: https://blog.csdn.net/m0_58972462/article/details/123572070
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。