【问题标题】:Resize an image and maintain quality?调整图像大小并保持质量?
【发布时间】:2011-01-03 14:45:00
【问题描述】:

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

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

【问题讨论】:

    标签: php image-optimization


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-27
          • 2012-12-03
          • 2014-02-17
          • 2021-02-15
          • 1970-01-01
          • 2012-11-15
          相关资源
          最近更新 更多