0

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

发生的情况是,如果您上传的文件大于规定的参数,图像会被裁剪,然后以 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;
4

3 回答 3

5

正如您所说,以 30% 的速度保存然后以 100% 的速度重新保存将创建冗余数据,无论您是裁剪、调整大小等等。

不幸的是,JPEG 压缩会累积数据丢失,因此压缩到 30%,处理图像,然后重新压缩看起来总是比原始压缩更差。经验法则是避免压缩(尤其是像 30% 这样的重压缩),直到过程尽可能晚。所以以 100%(或 80% 如有必要)上传,然后压缩。

编辑:显然,jpegtran(google it)可以在不首先解压缩图像的情况下进行裁剪等操作,只要图像大小遵循一定的约束(通常宽度和高度为 16 像素的倍数)。自己没有尝试过,但它可能适合您的目的。

于 2011-01-03T14:56:29.157 回答
2

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

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

于 2011-01-03T14:55:25.163 回答
0

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

于 2011-01-03T14:51:16.463 回答