PHP: 如何在不损失可见质量的情况下压缩图像(自动化)?

19
我想知道如何自动找出最佳的压缩比率(小文件大小+无质量损失)。
目前我正在使用imagejpeg()$quality = 85来处理每个.jpg文件。
PageSpeed(Chrome插件)建议降低一些图片的质量以节省一些KB。降低的百分比是不同的。
我想编写一个定时任务,遍历特定目录并优化每个图片。
PageSpeed或TinyPNG是如何找出最佳优化质量的?这是否可能通过PHP或其他服务器端语言实现?

你已经缓存了 imagejpeg() 调用,对吧? - Pekka
@Pekka:是的,我会。我会将图像调整大小并保持100%的质量。cronjob稍后会对其进行优化。85%的质量只是因为我还没有算法。 - Mr. B.
1个回答

28

TinyPNG使用pngquant

Pngquant有设置所需质量的选项,类似于JPEG。您可以运行类似以下内容的命令:

<?php system('pngquant --quality=85 image.png'); ?>

Pngquant网站提供了示例代码,展示如何在PHP中使用pngquant


对于JPEG,您可以应用无损的jpegcrush

JpegMini(商业软件)和jpeg-archive(免费软件)都是有损的,并且可以自动找到JPEG的最佳图像质量。

在PHP中,您可以通过观察重新压缩后文件大小的变化来粗略估计JPEG被压缩了多少。以相同或更高质量重新压缩的JPEG文件大小不会有太大变化(但会失去视觉质量)。

如果您重新压缩JPEG并看到文件大小减半,请保留重新压缩的版本。如果文件大小仅下降了10-20%,则保留原始版本。

如果您想要自行压缩,请使用MozJPEG(这里是在线版本)。


我尝试了jpegcrush,但似乎不太有效。这个perl脚本只能帮我减少10%的文件大小。Jpegmini和tinyjpg可以做到70%。有没有更好的免费脚本可以做到呢? - TomSawyer
@TomSawyer,jpegcrush是无损压缩,可以获得最佳的文件大小/质量比。其他工具则不然,它们相当于以较低的质量重新保存文件,增加更多的失真,并可能导致更低的文件大小/质量比。如果一个工具可以为您的JPEG图像节省70%的空间,那么这意味着您使用了浪费性的高质量设置来创建该文件。 - Kornel
我不这么认为。我已经尝试使用jpgmini和tinyjpg压缩许多文件,几乎所有文件都可以压缩至少50%,而且质量相同,或者你可以用肉眼看出有什么不同。上述两种服务可以将我的文件大小减少70%,但jpegcrush最多只能减少10%。你应该尝试使用上述两种服务来看看差异。 - TomSawyer
1
@TomSawyer,当我说无损/有损时,我是指压缩术语中的上下文,其中“无损”意味着100%像素完全按位相同,而不是“在我看来相同”。失去肉眼看不到的细节是好的,但这就是为什么它被称为有损的原因。 - Kornel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接