png数据格式包括长度_超白痴向

去png的百科看了很久很久,还是有些没有搞懂。然后十几遍以后终于稍微知道这是些甚么构造了

最重要的是这一段

名称
字节数 说明
Length(长度) 4字节 指定数据块中数据域的长度,其长度不超过
(2 31-1)字节
Chunk Type Code(数据块类型码)
4字节
数据块类型码由ASCII字母(A-Z和a-z)组成
Chunk Data(数据块数据)
可变长度
存储按照Chunk Type Code指定的数据
CRC(循环冗余检测)
4字节
存储用来检测是否有错误的循环冗余码
Chunk Type Code(数据块类型码)就是各种标识啊。然后获取的的比如是十六进制的0x

比如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】89 
PNG标识【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




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值