在我的项目中,我们处理 png 图像。为了创建(编码)和读取(解码)png 图像,我们使用 libpng。从 libpng 可以使用指定压缩级别png_set_compression_level()
,并且实际上我们可以看见图像大小的一些变化,这让我们认为压缩已正确完成。
但为了正确、可靠地测试它,我需要(为了保持一致性,我本来也希望如此)一个png_get_compression_level()
函数来告诉您创建该特定 png 文件时使用了哪种压缩级别。不幸的是,事实并非如此。
有没有办法从 png 图像中获取这些信息(如果可能的话通过 libpng 会更好,但任何其他方法对我来说也足够好)?
答案1
尝试 ExifTool。我还没有。
http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/index.html
找到标签的 PNG 语法
下载,无需安装即可进行命令行操作 http://www.sno.phy.queensu.ca/~phil/exiftool/ 提取阅读帮助
使用标签和文件名从 cmd shell 运行 exiftool
- 该过程可能取决于 PNG 格式文件版本,因此请阅读命令帮助详细信息(详尽)
答案2
根据 zlib 规范(RFC-1950),PNG 文件中的 zlib 数据流包含一个两位“FLEVEL”标志:
FLEVEL (Compression level)
These flags are available for use by specific compression
methods. The "deflate" method (CM = 8) sets these flags as
follows:
0 - compressor used fastest algorithm [levels 0, 1]
1 - compressor used fast algorithm [levels 2-5]
2 - compressor used default algorithm [level 6]
3 - compressor used maximum compression, slowest algorithm [levels 7-9]
pngcheck 检查 FLEVEL 并报告如下:
pngcheck -v rose.png
[...]
chunk IDAT at offset 0x00073, length 6742
zlib: deflated, 16K window, maximum compression
虽然这无法区分所有 10 种可能的压缩级别,但它可以作为创建 libpng png_get_compression_level() 函数的基础,该函数至少可以告诉您一些信息。