使用哪个选项(ImageMagick还是GraphicsMagick)可以生成文件大小最小的PNG?

14

ImageMagick生成的PNG文件非常大,GraphicsMagick比较好一些,但我仍在寻找与convert一起使用以获得最小文件大小PNG的最佳选项。

我有一个文件大小较小的大PNG图片,但是通过IM convert处理后,我无法达到该文件大小,更不用说使其更小了。 使用GM convert可以稍微缩小它,但我正在寻找改进方法,适用于我遇到的任何图像

gm convert -quality 95 a_png.png gm.png
convert -quality 95 -depth 8 a_png.png im.png
gm identify *

a_png.png PNG 2560x2048+0+0 PseudoClass 256c 8-bit 60.1K 0.000u 0:01
gm.png[1] PNG 2560x2048+0+0 PseudoClass 256c 8-bit 60.0K 0.000u 0:01
im.png[2] PNG 2560x2048+0+0 DirectClass 8-bit 130.2K 0.000u 0:01 

哪些选项可以生成最小的 PNG 文件大小?

(是的,我熟悉 OptiPNG、PNGOUT 和 Pngcrush。但我需要的是在我运行的每个 *nix 终端都能使用的选项。)


1
将其转换为1x1 PNG8的那些。 - Ignacio Vazquez-Abrams
当您可以在计算机上执行脚本时,您也可以将文件放在其中,对吧?那么,静态链接pngcrush并将其放在您正在使用的*nix框中如何? - thejh
1
@thejh,是的,我可以这样做。然而,在生产环境中通常不可接受。此外,IM/GM可能是最常用的图形包之一。所以我相信只是找到合适的选项的问题... - Jonah Braun
Gimp生成的PNG文件非常小(通常比PNGOUT和PNGCrush更好)。但是如果需要高性能,它可能不是最佳解决方案,对吧? - pmoleri
谢谢您的建议,但Gimp在无头服务器上脚本化/部署有些困难。 :) - Jonah Braun
嗨Jonah,我在使用GraphicsMagick1.3.*压缩PNG文件时遇到了问题。一些PNG文件出现了不明显的大小翻倍情况。我想知道你是否也遇到了这个问题? - toc777
3个回答

13

看起来你和我在寻找同一个答案。不幸的是,似乎没有很多人对GraphicsMagick有很好的了解。这是我目前为止学到的内容:

Quality操作符只对JPEG图像有效,对于PNG和GIF等其他格式的图像来说,并不能正常工作。在我尝试将其应用于PNG和GIF文件时,它只会使文件变得更大。

我对我的PNG和GIF文件进行了如下操作,以减小它们的文件大小:

gm convert myImage.png +dither -depth 8 -colors 50 myImage.png
  • +dither 参数可以在减少图像颜色时停止任何抖动(这会减小文件大小)。

  • -depth 8 可能是不必要的,因为大多数 PNG 文件已经是深度 8 了。

  • -colors 50 将图像中的颜色数量减少到 50,这是真正减小无损格式(如PNG或GIF)图像大小的唯一方法。

显然,为了获得最佳的图像质量 / 大小比,不能仅仅减少图像深度或颜色数量而不知道当前的深度和颜色数量。为了确定这些信息,我正在执行以下操作:

gm identify -format "file_size:%b,unique_colors:%k,bit_depth:%q" myImage.png

对于我的图片;这将返回

file_size:100.7k,unique_colors:13455,bit_depth:8

问题在于GraphicsMagick缩减颜色时总是至少缩减到255种,因此您无法将颜色数设置为300。此外,对于PNG文件的alpha通道似乎存在问题;如果图像具有透明度,则减少颜色将这些颜色替换为透明;而使用imagemagick则不会发生这种情况。


对于JEPG格式的图片,您可以添加+profiles "*"来删除图像中的任何配置文件,这将略微减小图像大小。我认为因为我们都在尝试做同样的事情,所以我们可以分享关于这个问题的知识。如果您发现了其他信息或有任何问题,请给我留言。谢谢。 - toc777
感谢toc777提供的信息丰富的帖子。有一个更正:对于PNG文件,-quality确实会影响文件大小,但它与JPEG的操作不同,请阅读规范以获取详细信息,我发现- quality 95可以生成最小的PNG文件。以下是一个Bash单行命令来演示:for i in {1..100}; do gm convert big_yet_small.png -quality $i $i.png; done - Jonah Braun
我们也遇到了 GM 透明度错误的问题。这似乎会在较大的图像上触发,在使用 IM 进行缩小处理后再使用 GM 进行处理是一种解决方法。需要提交一个错误报告... - Jonah Braun
1
嗨Jonah,我也在做同样的事情,但后来发现这个问题在更新的GraphicsMagick(1.3)中已经修复了。好吧,对我测试过的所有图像都已经修复了。我猜这个错误已经被修复了,但我找不到任何关于它的错误报告。 - toc777
更多信息请查看我的答案http://stackoverflow.com/questions/4217960/need-help-understanding-the-imagemagick-graphicsmagick-colors-option - toc777
你使用的是什么类型的PNG图像?在我的任何测试图像上,-quality 95会使它们稍微变大。 - toc777

7
我刚刚又看到了这个问题,所以我会更新一下。GraphicsMagick和ImageMagick存在一个严重的问题。它们无法使用tRNS块写出PNG图像,这意味着如果您尝试读取具有tRNS块的图像,然后将其写出,则图像将变得更大。GM不是压缩图像的最佳工具。您需要使用单独的工具,如OptiPNG,在使用Image/GraphicsMagick之后再次压缩PNG。在对图像运行GraphicsMagick后使用OptiPNG,可以获得高达60%的文件大小缩小。

此外,我想知道您是否遇到了RGBA图像和位深度的问题。对于某些图像,我收到“无效位深度”异常。我看不到任何原因。


3

我还没有找到在命令行中完成它的方法,但我找到了这个免费的网站(http://tinypng.org/),它做得非常好,我的测试图片缩小了71%,最终大小只有原始大小的29%。看起来你可以一次上传20张图片。我正在研究他们是如何做到的。

http://tinypng.org/


1
它可能在2013年是免费的。 - 23inhouse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接