如何将 PNG 图像调整为指定大小 (kb)

the*_*yen 0 php imagemagick imagick

对于 jpg 图像,我可以将图像长度调整为 200kb:

$imagickObject->setOption('jpeg:extent', "200kb");
Run Code Online (Sandbox Code Playgroud)

但我找不到 png 图像的解决方案。

$imagickObject->setOption('png:extent', "200kb"); not work 
Run Code Online (Sandbox Code Playgroud)

有人有解决办法吗?

请帮忙。

Mar*_*ell 5

太长了;如果保存为 PNG 而不是 JPEG,您必须反复运用您的技能和判断力来决定要在哪些方面做出妥协,以使文件更小。

更长的解释

阻止您做您想做的事情的原因是 JPEG 是为现实生活中的照片设计的,JPEG = “联合图像专家组”。它在图片质量上进行了权衡,以便能够在存储卡和磁盘上容纳大量照片,并能够通过网络快速传输图像。它是有损的——允许丢弃质量。

PNG 更适合演示图形和计算机生成的带有纯色块的图表,而不是现实生活中对象的细微细节。它是无损的,但有一个问题——它不能为了节省空间而丢弃细节。

因此,您对 PNG 的选择较少 - 您几乎必须选择要做出哪些妥协。


正如 Fred (fmw42) 在评论中正确指出的那样,丢弃信息的一种方法是减小图像尺寸。那么,让我们看一下这张由 Chris Niccolls 制作的 240kB JPEG 图像:

在此输入图像描述

所以,如果我把它变成全彩 PNG,它的大小为 973kB:

magick owl.jpg owl.png
-rw-r--r--     1 mark  staff   973K 21 Feb 11:05 owl.png
Run Code Online (Sandbox Code Playgroud)

而且,如果我将尺寸减小 50%,则结果为 318kB:

magick owl.jpg -resize 50% owl.png
-rw-r--r--     1 mark  staff   318K 21 Feb 11:06 owl.png
Run Code Online (Sandbox Code Playgroud)

使其更小的另一种方法是降低颜色分辨率而不是空间分辨率,即减少颜色数量而不是像素数量。因此,我可以将颜色减少到 127、63、31 或 15,如下所示:

magick owl.jpg -colors 127 PNG8:owl-127.png
magick owl.jpg -colors 63 PNG8:owl-63.png
magick owl.jpg -colors 31 PNG8:owl-31.png
magick owl.jpg -colors 15 PNG8:owl-15.png
Run Code Online (Sandbox Code Playgroud)

这会减少尺寸,如下所示:

-rw-r--r--@    1 mark  staff   368K 21 Feb 10:40 owl-255.png
-rw-r--r--@    1 mark  staff   329K 21 Feb 10:38 owl-127.png
-rw-r--r--@    1 mark  staff   252K 21 Feb 10:38 owl-63.png
-rw-r--r--@    1 mark  staff   225K 21 Feb 10:38 owl-31.png
-rw-r--r--@    1 mark  staff   171K 21 Feb 10:42 owl-15.png
Run Code Online (Sandbox Code Playgroud)

这样也会影响画质。最左边的图像颜色最多,最右边的图像颜色最少。尝试将焦点放在最左边和最右边图像中鸟尾巴正下方的区域,以便最容易地看到差异:

在此输入图像描述


您可以做出的另一个可能的权衡是花费更长的时间创建文件以换取更小的文件。这就是 所使用的方法pngcrush。它获取图像并尝试 PNG 标准允许的所有可能的过滤和编码方法,并找到产生最小文件的方法。像这样使用它:

pngcrush -brute  owl-255.png owl-crushed.png

Total length of data found in critical chunks            =    333281
Best pngcrush method        =   7 (ws 15 fm 0 zl 9 zs 0) =    327985
Run Code Online (Sandbox Code Playgroud)

这样就节省了 5kB - YMMV。

在创建这个答案时,没有猫头鹰被压碎或受到其他伤害。