减少PHP中的图片大小

时间:2012-07-18 15:40:29

标签: php image compression

我需要一个可以减少图片大小的php类或API,而不会降低图片的比例或质量,比如“fileminimizer suite”软件。

1 个答案:

答案 0 :(得分:1)

减少图片的文件大小并非易事。

JPEG格式有损且已经非常优化;你可以用它做点什么,但它需要调整,可能被认为是“质量损失”。基本上,您希望降低高频噪声。 ImageMagick(及其PHP包装器)可能是一个不错的选择。您还可以删除一些冗余或无用的APPn块(Exif元数据等)并最多削减几千字节。

编辑:例如,您提到的网站采用了类似的技术。我只检查了两张图片:

http://www.image-compressor.com/images/gallery/429724_36675180.jpg
http://www.image-compressor.com/images/gallery/429724_36675180_bestquality.jpg

第二张图像的质量因子估计相当于87,原始文件包含60 Kb的APP数据,这对于观看来说是无用的。我这样说,因为使用了jpegtran实用程序(JPEG工具的一部分)

jpegtran -copy none -outfile 429724_36675180_stripped.jpg 429724_36675180.jpg

给我一​​个像素相同的文件,大小从221624减少到166123字节。这就是我对“Exif和其他APPn块剥离”的意思。 “不降低质量”这个的情况意味着'没有像素被触及任何方式,期间',然而jpegtran会节省60 Kb。

如果以几乎难以察觉的方式触摸某些像素,没有人可能会注意到是可以接受的,那么就更有可能了。

基于快速而肮脏的频率分析,我的疯狂猜测是www.image-compressor软件使用基于局部方差和PSNR的“感知质量度量”,并通过二分法将“良好”的再压缩因子归零或牛顿收敛(低于60的质量因子并不真正有用,质量与尺寸曲线在60到99之间适用于Newton-Raphson)。

当我说'需要调整可能被视为“质量损失”时,这个结果就是我所说的。如果这是可以接受的,您可以例如给出命令

djpeg -dct float < 429724_36675180.jpg \
| cjpeg -optimize -dct float -maxmemory 4096 -quality 89 \
  -outfile 429724_36675180_remade.jpg
随着APPn数据被剥离,质量下降到89,我们推出了一个35820字节大小的文件,对抗www.image压缩器,即36082(你的里程可能因怪癖而变化)在执行JPEG库)。 djpeg / cjpeg引入的失真与图像压缩器相似(PSNR 45.4279与ImageMagick报道的45.8822)。

总而言之,如果你想拥有类似于www-im-comp的东西,你可以安装JPEG工具(可能像/ apt-get install jpegtools / - 检查你的Linux发行版;但是工具存在于Windows和MacOS也运行

shell_exec("djpeg -dct float < $INPUTFILE "
          ."| cjpeg -optimize -dct float -maxmemory 4096 -quality $QUALITY "
          ."-outfile $OUTPUTFILE");

然后使用Imagick验证INPUT和OUTPUT之间的区别:

http://www.php.net/manual/en/imagick.compareimagechannels.php

(或者您可以通过shell_exec使用ImageMagick的 compare 实用程序)。我希望你能得到与图像压缩器非常相似的结果。

===

对于PNG格式,您可以使用多个实用程序做得更好一些,这些实用程序会对信息进行重新排序并为您提供逐像素相同但更小的图像。根据图像的次优程度,节省可能从无到有15%不等。看看PNGCRUSH,PngOPT,PNG-Gauntlet等。

这些实用程序还可以减少调色板大小,从而消除不需要的颜色。

然后,您可以删除图像本身中一些视觉上无关的高熵源,从而提高可压缩性。可以使用几种“斑点去除”算法,ImageMagick再次成为你的朋友。我在PHP扩展中使用C处理核心做了一次,但参数调整是一个真正的镀金母狗,我期待ImageMagick也是如此。修剪得太少,你什么也得不到 - 修剪太多,你留下一个平坦的,分色的图像。

但是,我担心没有通用的,已经制作的课程可以做到这一点。您需要引导ImageMagick的API或shell_exec一些实用程序,如pngout。

编辑:为了完整起见,对GIF应用与PNG相同的概念。实际上,使用PNG几乎总是比使用GIF更好,除了真正的小文件,其中GIF87a提供的开销更少。但是如果需要进行这样的字节选择,那么我会研究“spriting”我的网页图形:可以通过这种方式获得的HTTP和往返开销将胜过使用小型GIF87a文件可以想象得到的任何东西。