使用ImageMagick压缩PNG图像

7

为了压缩JPEG图像,我可以执行以下操作:

$thumb = new Imagick();
$thumb->readImage("url");
$thumb->setImageCompression(Imagick::COMPRESSION_JPEG);
$thumb->setImageCompressionQuality(80);

然而,我还需要压缩PNG图像(保留透明度)以减小文件大小。是否有使用ImageMagick实现此目的的方法?


PNG图像是隐式压缩的。您是否有任何特定的代码或结果偏差需要说明? - mario
隐式压缩?不确定你的意思.. 我明白压缩方式有所不同。 - frosty
你可以提高zlib压缩级别,但这通常不会对输出大小产生太大影响。 - mario
1
@mario 的意思是 PNG 文件已经被压缩了。没有必要(也不是很有效)再次压缩它们。 - uri2x
那么https://pngquant.org/是什么?它是如何将它们压缩得如此之多的呢? - frosty
@frosty 基本上,pngquant 可以减少 PNG 文件中的颜色数量。标准设置将把 24bpp 图像缩减到 8bpp。每像素较低的位数意味着要压缩的数据量大大减少。 - rostok
2个回答

12

pngquant有效地量化或减少图像中的颜色数量,直到质量出现可辨别的下降。您可以在ImageMagick中尝试类似的操作,如下所示...

首先,使用内置的rose:图像,检查图像中的颜色数量-它是3,019:

convert rose: -format %k info:
3019

制作一个PNG文件并检查其大小 - 大小为6,975字节

convert rose: rose.png
ls -l rose.png
-rw-r--r--@ 1 mark  staff  6975  5 Sep 20:57 rose.png

enter image description here

现在将玫瑰转换为255种颜色并检查大小——它已经减小到3,691字节:
convert rose: -colors 255 rose255.png
ls -l rose255.png
-rw-r--r--  1 mark  staff   3691  5 Sep 21:02 rose255.png

enter image description here

现在将玫瑰花转换为64种颜色并检查大小 - 缩小到2,361字节。
convert rose: -colors 64 rose64.png
ls -l rose64.png
-rw-r--r--  1 mark  staff  2361  5 Sep 21:04 rose64.png

enter image description here

另一种优化或减小PNG文件大小的方法是使用-strip从图像中剥离任何元数据,例如拍摄日期和时间、相机和镜头型号、创建图像的程序名称以及版权和颜色配置文件。
还值得注意的是,透明像素的颜色通常是无关紧要的,因为您看不到它们,但统一的像素通常可以更好地压缩。因此,在保存PNG文件时,将所有透明像素设置为相同的颜色可能是一个好主意,使用-alpha background即可实现。 示例
convert -size 512x512 xc:gray +noise random a.png                                      # create an image of random noise
-rw-r--r--@ 1 mark  staff  1576107  6 Sep 11:37 a.png                                  # 157kB

convert -size 512x512 xc:gray +noise random -alpha transparent a.png                   # recreate but make transparent
-rw-r--r--@ 1 mark  staff  1793567  6 Sep 11:38 a.png                                  # 179kB, extra transparency channel

convert -size 512x512 xc:gray +noise random -alpha transparent -alpha background a.png # make all transparent pixels black
-rw-r--r--@ 1 mark  staff  1812  6 Sep 11:38 a.png                                     # Presto!

我该如何在ImageMagick中实现这个? - frosty
6
convert 就是 ImageMagick。 - Mark Setchell
1
我真的不太明白如何使用PHP来完成这个任务。你能使用 http://example.com/image.png 提供一个示例吗?谢谢。参考链接如下:http://puu.sh/k1a67/0dd24b43e7.png - frosty
作为后续,pngquant如何确定“临界失真”?例如,如果一张图片有5000种颜色,它会选择其中的25%吗?是否有一个通用的经验法则? - frosty
1
话虽如此,问题与命令行无关,这个答案应该澄清为什么PHP Imagick不适合这项工作。 - Valerio Bozz
显示剩余5条评论

2

使用-set colorspace Gray设置灰度不会减小PNG文件的大小,除非还使用了以下选项:

-define png:compression-level=9 -define png:format=8 -define png:color-type=0 -define png:bit-depth=8

这将生成具有最高PNG压缩的8位灰度图像。 添加这些选项将使我的图像大小减小3倍,因为现在它只有一个通道(灰度),而之前有3个通道(RGB)。

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