是否可以从 png 图像中检索压缩级别?

是否可以从 png 图像中检索压缩级别?

在我的项目中,我们处理 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() 函数的基础,该函数至少可以告诉您一些信息。

相关内容