转换(ImageMagick或GraphicsMagick)的哪些选项会生成最小(文件大小)的PNG?

Jon*_*aun 13 compression png imagemagick graphicsmagick

ImageMagick创建了一些相当大的PNG.GraphicsMagick要好得多,但我仍然在寻找与convert一起使用的最佳选项,以获得最小的文件大小png.

我这里有一个带有小文件大小大png,并通过IM转换传递我无法达到该文件大小,更不用说让它变小了.通过GM转换我可以稍微小一些,但我正在寻找改进,一般来说我遇到的任何图像.

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 
Run Code Online (Sandbox Code Playgroud)

什么转换选项产生最小的PNG文件大小?

(是的,我熟悉OptiPNG,PNGOUT和Pngcrush.但是我正在寻找一些可以在我正好碰上的每个*nix盒子上使用的东西.)

toc*_*777 11

看起来你和我正在寻找相同的答案.不幸的是,似乎没有很多人对GraphicsMagick有很好的了解.这是我到目前为止所学到的,

质量操作员无法正常使用JPEG以外的任何图像.对我来说,它只是在PNG和GIF上使用时使文件大小更大.

我已经对我的PNG和GIF文件执行了此操作以减小其大小:

gm convert myImage.png +dither -depth 8 -colors 50 myImage.png
Run Code Online (Sandbox Code Playgroud)
  • +dither当颜色减少时,停止图像的任何抖动.(这会减小文件大小)

  • -depth 8 可能没必要,因为大多数PNG文件已经是深度8.

  • -colors 50 将图像中的颜色数量减少到50,这是真正减少以PNG或GIF等无损格式存储的图像大小的唯一方法.

显然,为了获得最佳的图像质量/尺寸比,您无法在不知道当前深度和颜色数量的情况下减少图像深度或颜色数量.为了确定这些信息,我正在做以下事情

gm identify -format "file_size:%b,unique_colors:%k,bit_depth:%q" myImage.png
Run Code Online (Sandbox Code Playgroud)

对于我的形象; 这回来了

file_size:100.7k,unique_colors:13455,bit_depth:8
Run Code Online (Sandbox Code Playgroud)

问题是当GraphicsMagick减少颜色时它总是减少到至少255,所以你不能将颜色数量设置为300例如.此外,PNG文件的alpha通道似乎也存在问题; 如果图像中有透明度,减少颜色会将这些颜色替换为透明; 与imagemagick它不会这样做.


toc*_*777 6

我刚刚再次遇到这个问题所以我会更新,GraphicsMagick和ImageMagick有一个严重的问题.他们无法使用tRNS块写出PNG图像,这意味着如果您尝试读取具有tRNS块的图像然后将其写出,则图像将会更大.GM不是压缩图像的最佳工具.在使用Image/GraphicsMagick之后,您需要使用单独的工具(如OptiPNG)再次压缩PNG.在图像上运行GraphicsMagick后,使用OptiPNG时,我的文件减少了60%.

此外,我想知道你是否遇到过有关RGBA图像和位深度的问题.对于某些图像,我得到"无效位深度"异常.我看不出任何理由.