Go语言解析PNG图像文件(上)

源代码下载链接
https://github.com/gemark/WinIconTools/tree/master/png

关于解析PNG,实现了两套代码,下面是第一个实现:
这个实现没有一次性解析所有chunk,后来我觉得不满意,由重新写了一次性解析所有chunk的第二套代码,在这套代码下面有贴。
存放在github.com上的源代码链接
Go语言处理Windows系统的图标ICO文件(中)
Go语言处理Windows系统的图标ICO文件(下)

下面是第二套代码,不同的是,chunk没有保存到切片中,而是存到链表里面了。数组访问快,但是提取指定内容还是要遍历,既然如此还不如使用链表,考虑过,也可以使用map映射结构来保存chunks,但是考虑到后面如果我要将数据重新操作后,写入新的PNG文件,还是顺序的,所以决定使用链表形式保存chunks。

我们接触的PNG文件大部分使用的是DEFLATE算法压缩,也就是:

PNG uses DEFLATE, a non-patented lossless data compression algorithm involving a combination of LZ77 and Huffman coding. Permissively-licensed DEFLATE implementations, such as zlib, are widely available.

即zlib实现的LZ777和霍夫曼编码压缩,go语言的压缩库compress/zlib提供了压缩/解压实现。
霍夫曼树的Go语言实现可参考compress/bzip2包所在的目录中的huffman.go源文件:
Go语言解析PNG图像文件(上)_第1张图片
如果使用了Photoshop来保存的话,会有大量的无用‘标注信息’,例如’tExt’这样的chunk,下面的代码,我实现了,解析’tExt’块的相关代码。

关于PNG的IDAT图像数据中的压缩:

78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression

上面的2个字节表示IDAT数据的压缩级别,在IDAT块标识的后2个字节:
Go语言解析PNG图像文件(上)_第2张图片
上面的就是0x78 DA,表示‘最佳压缩级别’。
下面列出所有的压缩的魔术头(zlib/gzip magic headers):

Level | ZLIB  | GZIP 
  1   | 78 01 | 1F 8B 
  2   | 78 5E | 1F 8B 
  3   | 78 5E | 1F 8B 
  4   | 78 5E | 1F 8B 
  5   | 78 5E | 1F 8B 
  6   | 78 9C | 1F 8B 
  7   | 78 DA | 1F 8B 
  8   | 78 DA | 1F 8B 
  9   | 78 DA | 1F 8B 

在后面的文章中,我会例举出PNG的解析。

你可能感兴趣的:(Go语言)