Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以尝试进一步压缩此PNG图像的其他哪些参数?_Png_Zlib - Fatal编程技术网

我可以尝试进一步压缩此PNG图像的其他哪些参数?

我可以尝试进一步压缩此PNG图像的其他哪些参数?,png,zlib,Png,Zlib,我写了一个程序来无损地重新压缩PNG文件。因为不幸的是,没有一个参数可以保证这样做的最佳性,所以我只检查所有参数(计算时间不是目标,无论如何也不是不合理的) 具体而言,有: 要传递到png\u set\u compression\u level(0到9)的10级zlib压缩 5个zlib策略传递到png\u set\u compression\u策略(系统、过滤、仅哈夫曼、RLE和静态哈夫曼) 交错(2个值) 要传递到png\u set\u filter中的一组不同的预过滤器。我使用PNG\u

我写了一个程序来无损地重新压缩PNG文件。因为不幸的是,没有一个参数可以保证这样做的最佳性,所以我只检查所有参数(计算时间不是目标,无论如何也不是不合理的)

具体而言,有:

  • 要传递到
    png\u set\u compression\u level
    (0到9)的10级zlib压缩
  • 5个zlib策略传递到
    png\u set\u compression\u策略
    (系统、过滤、仅哈夫曼、RLE和静态哈夫曼)
  • 交错(2个值)
  • 要传递到
    png\u set\u filter
    中的一组不同的预过滤器。我使用
    PNG\u ALL\u过滤器来检查它们
因此,我的代码基本上压缩了所有可能的(10*5*2=100)组合,并选择了大小最小的组合

这适用于各种典型图像。对于某些图像,减少量可能高达20%(虽然5%更为典型)。例如,对于图像密集型网站,这是显而易见的


这是一张PNG图像():

这是一个测试图像。它正好占用144391字节。我的策略是145501字节

我不太担心这是0.77%大。我担心我检查了所有的参数,其中一个应该是最优的。所以这个



所以我的问题是:发生了什么?我在尝试时遗漏了哪些参数?我在文档中没有看到任何其他内容。

通过检查的来源,我发现:

  • zlib内存使用参数(从
    png\u set\u compression\u mem\u level
    间接传递)也会影响压缩比。不管法庭怎么说,这都是事实。我对此没有任何解释,我认为这是一件坏事

    当我将其设置为
    8
    (默认值)而不是我使用的
    9
    时,我能够重现原始图像

  • 过滤器参数(到png\u set\u filter)起作用。这是有道理的;为特定行选择最佳过滤器并不一定意味着全局最优压缩(因为该行可能与相邻行压缩得不太好)。这是一个完全的猜测,因为这些都没有出现在文档中

    当我对这些值进行优化时,会得到一个140541字节的图像,这似乎是最优的


  • 您可以尝试从zlib的最佳压缩中获得一些收益。

    为什么不能实现呢?您不知道您的原始图像是否使用与您使用的软件完全相同的软件进行了压缩。@pvg事实上,我碰巧知道保存程序使用的zlib和libpng版本与我使用的版本相同。我想您可以试用一个可用的免费png优化器,看看它们能提供什么。如果它比较小,那么假设你在这场大雁追逐中遗漏了什么似乎是相当合理的。质量?那一定是个错误。PNG压缩是无损的。@MarkAdler在(特别是无损)压缩的上下文中,质量是指算法获得高压缩比的能力。损失是指信息的损失。但这显然是不清楚的;我编辑过。啊,好的。链接文档没有说内存级别不会影响压缩级别。我不知道你说的“这是件坏事”是什么意思。“pngcrush-zmem6-brute”写的是一个140113字节的PNG文件。默认情况下,Pngcrush不探索zmem参数,因为尽管有时会有回报,但它通常太小,不值得将Pngcrush运行时间增加一倍。