我目前正在为了学习目的而自己编写一个小的PNG图像I/O库.我的问题如下:
我创建了一个尺寸仅为2 x 2的小PNG,并在十六进制编辑器中打开它以研究其内容.这是我使用GIMP创建的图像,并以压缩"9"存储.
(请注意,这是原始2 x 2像素图像的放大图像;))

所以我猜没有压缩,这在内存中看起来像这样:
00 00 00 FF 00 00 00 00 FF 00 FF 00
Run Code Online (Sandbox Code Playgroud)
存储时没有alpha通道.
(为了清楚起见,我在这里只说了这个.我知道压缩,并且不希望在文件中看到这个字节模式).
我提取了IDAT块并剥离了块ID("IDAT")和尾随CRC值并得到了这个字节序列:
08 D7 05 C1 01 01 00 00 00 80 10 FF 4F 17 10 48 06 0F FE 02 FE
Run Code Online (Sandbox Code Playgroud)
现在前两个字节08 D7包含有关编码块的信息.最后四个字节0F FE 02 FE必须是ADLER32校验和.
这最终让我得到以下字节:
05 C1 01 01 00 00 00 80 10 FF 4F 17 10 48 06
Run Code Online (Sandbox Code Playgroud)
以二进制表示形式写的这些字节是:
0000 0101 1100 0001 0000 0001 0000 0001
0000 0000 …Run Code Online (Sandbox Code Playgroud)