调整图像大小并保持质量?

时间:2011-01-03 14:45:00

标签: php image-optimization

我在调整图片大小时遇到​​了问题。

如果您上传的文件大于规定的参数,图片会被裁剪,然后以100%的质量保存。

所以,如果我上传一个272Kb的大型jpeg。图像被裁剪100个像素。然后文件大小上升到1.2Mb。

我们以100%的质量保存图像。我认为这是导致问题的原因。图像以30%的质量从Photoshop导出,从而减小了文件大小。以100%质量重新保存图像会产生相同的图像,但我假设有大量冗余文件数据。

之前有没有遇到过这个?有没有人有解决方案?

这就是我们正在使用的。

$source_im = imagecreatefromjpeg ($file);
$dest_im = imagecreatetruecolor ($newsize_x, $newsize_y);
imagecopyresampled (
    $dest_im, $source_im,
    0, 0,
    $offset_x, $offset_y,
    $newsize_x, $newsize_y,
    $sourceWidth, $sourceHeight
);

imagedestroy ($source_im);
if ($greyscale) {
    $dest_im = $this->imageconvertgreyscale ($dest_im);
}
imagejpeg($dest_im, $save_to_file, $quality);
break;

3 个答案:

答案 0 :(得分:5)

如你所说,保存在30%然后重新保存为100%将创建冗余数据,无论你裁剪,调整大小等等。

不幸的是,JPEG压缩会累积数据丢失,因此压缩30%,处理图像,然后重新压缩总是看起来比原始压缩更糟糕。经验法则是尽可能避免压缩(特别是30%的重压缩)。所以上传100%(或必要时为80%),然后压缩。

编辑显然,只要图片大小遵循某些约束(通常宽度和高度为16像素的倍数),jpegtran(google it)就可以执行裁剪等操作而无需先解压缩图像)。没有亲自尝试过,但它可能符合您的目的。

答案 1 :(得分:2)

保存质量为30%的JPEG时,不会保存大量像素信息。当使用gd再次打开它时,会创建一个带有清晰新像素的新图像。这些看起来好不好(取决于图像最初保存的质量)是无关紧要的。保存此新图像时,您将创建一个新的JPEG文件。将质量设置为100%基本上可以节省每个像素,这当然占用了大量空间。 (我正在推广,但你明白了。)无论原始版本保存的质量设置是无关紧要的,以100%质量保存大图像会占用大量空间。

唯一的解决方案是使用较低质量的设置保存图像;通常大约70%的东西几乎与完美无法区分,但节省了大量的字节。您可能还想尝试PNG,它是无损的,但可能(或可能不)提供更好的压缩比。

答案 2 :(得分:0)

您的假设是正确的,您实际上是在无损失的情况下保存它。我用视频编码遇到了这个问题,我会缩小分辨率,但会将其增加到无损耗,最终尺寸是原始尺寸的两倍。如果它是一个足够小的图像,我会使用一个好的基于调色板的图像类型或一个本机无损而不是jpeg的类型来保存它。要么以50-70%的质量保存它,让jpeg做它擅长的事情。