PHP GD imagejpeg:输出文件大小比原始大

时间:2015-01-14 05:33:54

标签: php imagemagick gd image-manipulation gimp

以下脚本应该创建质量较低且文件较小(kb)的图像,而不是创建质量较低但文件较大的图像。

在我的测试中,原始大约300kb,使用90%的质量,输出几乎是双倍,使用100%质量,输出超过1mb ...

<?php

$quality = 90;
$path = '/var/www/TEST/';
$inputSrc = $path . 'original.jpg';
$outputSrc = $path . 'after' . $quality . '.jpg';

$handler = imagecreatefromjpeg($inputSrc);
imagejpeg($handler, $outputSrc, $quality);

我认为问题与imagejpeg糟糕的实施有关......

  • 有什么方法可以解决这个问题吗?
  • ImageMagick更好的解决方案吗?

由于

更新

我很好奇所以我尝试了ImageMagick,不幸的是我有类似的结果(稍好一点)。

完整测试结果:

原始尺寸:294.6Kb

  • GD(imagejpeg) 90%:581.7Kb
  • GD(imagejpeg) 100%:1.1Mb
  • ImageMagick 90%:431.7Kb
  • ImageMagick 100%:780.9kb

更新2

我用GIMP进行了一些测试,看起来为了获得一个与原始文件大小非常相似的文件,你必须选中use quality setting from original image选项。

现在我感到困惑...因为当我选择该设置时,Gimp会自动将输出质量更改为74%(对于示例图像)。
我假设JPEG质量值,如果低于100%,会在每次保存迭代时降低图像质量......但我开始认为我错了。

更新3

没有必要使用ImageMagick指定样本的质量,如果将其留空ImageMagick将使用输入图像中检测到的相同质量。
因此,对于示例图像,它被检测为69的质量,outfile是 326kb 。到目前为止,这是最好的结果。

这里是我正在使用的图片:

enter image description here

1 个答案:

答案 0 :(得分:3)

我看了一下这个。您可以在ImageMagick中向后工作,而不是定义质量并查看结果大小,您可以定义大小并查看质量结果。因此,对于一个具体示例,您可以说您希望输出文件不超过100kB,如下所示:

convert MShRR.jpg -define jpeg:extent=100k out.jpg

你得到99kB这样:

-rw-r--r--@  1 mark  staff    294608 14 Jan 09:36 MShRR.jpg
-rw-r--r--@  1 mark  staff     99989 14 Jan 09:44 out.jpg

在我看来,最终的图像有点张贴:

enter image description here

您可以经常添加少量模糊来伪装,如下所示:

convert MShRR.jpg -blur x0.5 -define jpeg:extent=100k out.jpg

enter image description here

YMMV - 你的里程可能会变化!!!