Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用ImageMagick压缩PNG图像_Php_Image Processing_Compression_Imagemagick - Fatal编程技术网

Php 使用ImageMagick压缩PNG图像

Php 使用ImageMagick压缩PNG图像,php,image-processing,compression,imagemagick,Php,Image Processing,Compression,Imagemagick,要压缩JPEG图像,我可以执行以下操作: $thumb = new Imagick(); $thumb->readImage("url"); $thumb->setImageCompression(Imagick::COMPRESSION_JPEG); $thumb->setImageCompressionQuality(80); 但是,我还需要压缩PNG图像(保留alpha透明度)以减小大小。有没有办法用ImageMagick做到这一点?pngquant有效地量化或减少图像

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

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

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

pngquant
有效地量化或减少图像中的颜色数量,直到出现明显的质量下降。你可以在ImageMagick中尝试类似的东西,就像这样

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

convert rose: -format %k info:
3019
然后制作一个
PNG
,检查大小-它是6975字节

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

现在,将玫瑰色转换为255种颜色,并检查大小-减少到3691字节:

convert rose: -colors 255 rose255.png
ls -l rose255.png
-rw-r--r--  1 mark  staff   3691  5 Sep 21:02 rose255.png

现在将玫瑰色转换为64种颜色,并检查大小-减少到2361字节

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!

使用
设置灰度-设置颜色空间灰度将不会减小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)。

PNG图像是隐式压缩的。是否有任何特定的代码或结果偏差要隐式压缩?我不知道你的意思。。我知道压缩在某些方面是不同的。你可以提高zlib压缩级别,但这通常不会对输出大小产生太大影响。@mario的意思是PNG文件已经被压缩了。没有必要(也不是很有效)进一步压缩它们。那么什么是-它是如何压缩它们这么多的?我在ImageMagick中如何做到这一点?
convert
是ImageMagick。哦,对不起。那么我可以做,
转换吗http://example.com/image.png: -格式化%k信息
?或者?我真的不明白如何用PHP实现这一点。。你能用
http://example.com/image.png
?非常感谢。我的意思是:我不会说很多PHP,但是你可以调用
exec('convert…')或使用类似
$Image=new Imagick(“http://..." );$num_colors=$image->getImageColors()