以下脚本应该创建质量较低且文件大小 (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 做了更多测试,发现为了获得与原始文件大小非常相似的文件,您必须选中选项使用原始图像的质量设置
。
现在我更困惑了......因为当我选择该设置时,Gimp 会自动将输出质量更改为 74%(对于示例图像)。
我假设 JPEG 质量值如果低于 100%,则会降低每次保存迭代时的图像质量……但我开始认为我错了。
更新3
使用 ImageMagick
时,无需指定样本的质量,如果将其留空,ImageMagick
将使用在输入图像中检测到的相同质量。
因此,对于示例图像,检测到的质量为 69,输出文件为 326kb。这是迄今为止最好的结果。
这是我正在使用的图像:
最佳答案
我稍微看了一下这个。您可以在 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
在我看来,生成的图像有点色调分离:
您通常可以添加少量模糊来掩盖这一点,如下所示:
convert MShRR.jpg -blur x0.5 -define jpeg:extent=100k out.jpg
YMMV - 您的里程可能会有所不同!!!
关于PHP GD imagejpeg : output file size is bigger size than original,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27936437/