0

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

4

1 回答 1

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-compressor 的大小为 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 的比较实用程序)。我希望您获得与图像压缩器非常相似的结果。

===

对于 PNG 格式,您可以使用几个实用程序做得更好,这些实用程序重新排序信息并为您提供逐像素相同但更小的图像。节省可能从零到 15% 不等,具体取决于图像的次优程度。看看PNGCRUSH、PngOPT、PNG-Gauntlet等。

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

然后,您可以删除图像本身中一些视觉上不相关的高熵源,从而提高可压缩性。可以使用几种“去污剂”算法,ImageMagick 再次成为您的朋友。我曾经在 PHP 扩展中使用 C 处理核心来做到这一点,但参数调整是一个真正的镀金婊子,我希望 ImageMagick 也是如此。修剪得太少,你一无所获 - 修剪太多,你会留下一个平坦的、分离的图像。

不过,恐怕没有通用的、已经制作好的课程可以做到这一点。您将需要试用 ImageMagick 的 API 或 shell_exec 一些实用程序,例如 pngout。

编辑:为了完整起见,GIF 的概念与 PNG 相同。实际上,使用 PNG 几乎总是比 GIF 更好,除了GIF87a 提供较少开销的非常小的文件。但是,如果需要这种字节选择,那么我会考虑“拆分”我的网页图形:可以通过这种方式获得的 HTTP 和往返开销将胜过使用小型 GIF87a 文件所能获得的任何东西。

于 2012-07-18T18:33:32.090 回答