我在调整图片大小时遇到了问题。
如果您上传的文件大于规定的参数,图片会被裁剪,然后以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;
答案 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做它擅长的事情。