去png的百科看了很久很久,还是有些没有搞懂。然后十几遍以后终于稍微知道这是些甚么构造了
最重要的是这一段
名称
| 字节数 | 说明 |
Length(长度) | 4字节 | 指定数据块中数据域的长度,其长度不超过
(2
31-1)字节
|
Chunk Type Code(数据块类型码)
|
4字节
|
数据块类型码由ASCII字母(A-Z和a-z)组成
|
Chunk Data(数据块数据)
|
可变长度
|
存储按照Chunk Type Code指定的数据
|
CRC(循环冗余检测)
|
4字节
|
存储用来检测是否有错误的循环冗余码
|
比如50 4e 47 ,是十六进制0x(50 4e 47 )对应的十进制(80 78 71)去看ASCII表就会发现080-P;078-N;071-G;从左到右
Chunk Data(数据块数据)的长度,在对应模块处有给出 比如0x(00 00 00 10)对应十进制(16)
更多参考:http://www.360doc.com/content/11/0428/12/1016783_112894280.shtml
样例说明
图片引自链接
0x0-7(8固定) 必须模块
说是区分文本【1】89PNG标识【3】50 4e 47
【4】0d 0a 1a 0a
================
0x08-20 (说明长度占用4+IHDR占4+说明长度数值+CRC校验4)必须模块
说明长度【4】0x十六进制
IHDR标识【4】
图像宽度【4】-
图像高度【4】 |
色深【1】 |
颜色类型【1】 |▷数据块
压缩方法【1】 |
滤波方法【1】 |
隔行扫描【1】-
CRC校验【4】
=================
sBIT模块(说明长度占用4+sBIT占4+说明长度数值+CRC校验4)可选模块
说明长度【4】0x十六进制
sBIT标识【4】
RGB采样频率【3】=▷数据块
CRC校验【4】
=================
PLET模块(说明长度占用4+PLET占4+说明长度数值+CRC校验4)可选模块
说明长度【4】0x十六进制
PLTE标识【4】
颜色数0【3】 -
…… |▷数据块
颜色数n-1【3】-
CRC校验【4】
==================
其他可选模块(说明长度占用4+标识占4+说明长度数值+CRC校验4)可选模块
说明长度【4】
对应标识【4】
数据块▷
CRC校验【4】
==================
IDAT数据块(说明长度占用4+IHDR占4+说明长度数值+CRC校验4)必须模块可包含多个
说明长度【4】
IDAT标识【4】
压缩数据块▷
CRC校验【4】
==================
IEND数据块(12说是通常是下面的形式。蛮好奇不通常会怎样)
说明长度【4】00 00 00 00
IEND标识【4】49 45 4E 44
CRC检验【4】AE 42 60 82
根据链接中对于IDAT这里的压缩数据的理解。这个貌似还不是LZ77。LZ77有待学习
0~2压缩信息,固定为0x78, 0xda, 0x1
3~6压缩块的LEN和NLEN信息
压缩的数据
最后4字节Adler32信息
LEN[0] LEN[1] [0]+[1]*256低字节在前=压缩数据的字节长度;
NLEN[0] NLEN[1] LEN^0xFFFF 对应左到右[无压缩的LZ77算法]异或
压缩的数据按照行(ScanLine)来存储的,为了区分第一行,PNG规定在每一行的前面加上0以示区分
假设8*8的像素,每个像素存放调色板编号,沿着方向
数据按位(bit)存储(从左到右)
→ 12 11 10 9 8 7 6 5
→ 11 10 9 8 7 6 5 4
→ 10 9 8 7 6 5 4 3
→ 9 8 7 6 5 4 3 2
→ 8 7 6 5 4 3 2 1
→ 7 6 5 4 3 2 1 0
→ 6 5 4 3 2 1 0 0
→ 5 4 3 2 1 0 0 0
遇到剪箭头存放0xOO
否则两两(左高右低),例如12*256+11=0x(CB)
00 CB A9 87 65
00 BA 98 76 54
00 A9 87 65 43
00 98 76 54 32
00 87 65 43 21
00 76 54 32 10
00 65 43 21 00
00 54 32 10 00