【问题标题】:Compress a PNG image with ImageMagick使用 ImageMagick 压缩 PNG 图像
【发布时间】:2015-12-01 12:36:15
【问题描述】:

要压缩 JPEG 图像,我可以这样做:

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

但是,我还需要压缩 PNG 图像(保留 alpha 透明度)以减小尺寸。有没有办法用 ImageMagick 做到这一点?

【问题讨论】:

  • PNG 图像被隐式压缩。您想允许任何特定的代码或结果偏差?
  • 隐式压缩?不知道你的意思..我知道压缩在某种程度上是不同的。
  • 您可以提高 zlib 压缩级别,但这通常不会对输出大小产生太大影响。
  • @mario 的意思是 PNG 文件已经压缩了。没有必要(也不是很有效)进一步压缩它们。
  • 那么pngquant.org 是什么 - 它是如何压缩它们的?

标签: php image-processing compression imagemagick


【解决方案1】:

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

现在将玫瑰转换为 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

现在将玫瑰色转换为 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

另一种优化或减小 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 中执行此操作?
  • convert ImageMagick.
  • 哦,对不起。那我可以吗,convert http://example.com/image.png: -format %k info?还是?
  • 我真的不明白如何用 PHP 做到这一点。你能用http://example.com/image.png 做一个例子吗?谢谢你。作为参考,我的意思是:puu.sh/k1a67/0dd24b43e7.png
  • 我不会说多少 PHP 但你可以打电话给exec('convert ...'); 或使用类似$Image=new Imagick( "http://..." );$num_colors = $image->getImageColors();的东西
【解决方案2】:

除非同时使用这些选项,否则使用 -set colorspace Gray 设置灰度不会减小 PNG 的文件大小:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 2011-02-12
    • 2013-12-28
    • 2016-05-02
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多