PNG文件格式
wild_foxer:
看了png specification和RFC1951,但根据自己的理解和实际数据有出入。规范说IDAT部分由一个zlib块组成,zlib块又包含一系列的compressed block。(没问题吧?)
zlib格式如下。
CMF | FLG | compressed data | alder32校验
其中compressed data前3bit是 1bit的BFINAL(1表示最后一个block) 和2bit的BTYPE(00表不压缩,01固定huffman压缩,10动态huffman压缩,11错误).这没错吧??
我用windows画图resize一副PNG图片至8*9像素大小,然后用ultraedit打开,找到iDAT部分,如下:
00 00 00 AE 49 44 41 54 28 53 63 F8 0F 05 07 0E 1E FA FF E4 FE.....
开始4bytes 00 00 00 AE 是后面 compressed data块的长度。
接着4bytes 49 44 41 54 是png图片iDAT关键块标示符。
接下来应该是zlib封装的数据了:
接着2bytes 28 53 分别是CMF,FLG 表示deflate算法中滑动窗口大小为32kb/(2**(7-2))=1kb。53二进制为01010011, 开始01表明FLEVEL为fast。
接下来应该是BFINAL, BTYPE了吧??
63 二进制为0110 0011。开始的0表示不是最后一块,但png图像大小为8*9,应该只有一块吧?接下来11为BTYPE吧?可是11是未定义的错误。怎么能为11呢?
求教!!!
|