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

Posted

技术标签:

【中文标题】PHP GD imagejpeg:输出文件大小比原始文件大【英文标题】:PHP GD imagejpeg: output file size is bigger size than original 【发布时间】:2015-01-14 05:33:54 【问题描述】:

以下脚本应该创建质量较低且文件大小 (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,并且输出文件为 326kb。这是迄今为止最好的结果。

这是我正在使用的图像:

【问题讨论】:

您可以将您的 jpeg 质量从 90 降低到 75(甚至更低),如果您可以使用 ImageMagick,它是一个很棒的工具! 同意上面的评论,问题出在90,大概就是这个问题。 来吧,如果我降低图像质量,我应该得到一个更小的文件大小.. 同样,如果我使用 100 的质量,我应该得到相同的文件大小,而不是我得到一个图像4 倍大 上传图片怎么样? 完成。我也测试了 imageMagik 【参考方案1】:

我看过这个。您可以在 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 - 您的里程可能会有所不同!!!

【讨论】:

我有点困惑,也许是因为我不是很喜欢图像处理......难道没有更大的尺寸就不能打开 jpg 并重新保存它吗? 不同的程序对色彩保真度、图像质量、平滑度、锐度、处理时间、文件大小做出不同的决定。 是的,当然。但是如果我保存 10 次图像并且每次选择质量 70% ......每个保存的文件的质量都会降低 30% 吗?据我了解没有

以上是关于PHP GD imagejpeg:输出文件大小比原始文件大的主要内容,如果未能解决你的问题,请参考以下文章

GD,加载 libJPEG,imagejpeg 返回 false

php jquery jcrop 和 imagejpeg

PHP 输出图像 imagegif imagejpeg 与 imagepng 函数

php转换bmp图片格式为jpg格式

调用未定义函数 Intervention\Image\Gd\imagejpeg()"

imagejpeg() 权限问题