【问题标题】:PHP Image Processing GD JPEG QualityPHP 图像处理 GD JPEG 质量
【发布时间】:2014-11-10 02:06:25
【问题描述】:

我开始使用 WideImage 图像处理库,但它生成的 JPEG 图像的质量存在问题。 WideImage 实际上使用GD,所以我只是使用GD PHP图像函数进行测试。

我的最终目标是调整图像大小,但这是我的测试代码,没有调整大小:

$srcImage = "path/to/image.jpg";
list($width, $height) = getimagesize($srcImage);
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($srcImage);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width, $height);
imagejpg($image_p, "path/to/image_resized.jpg", 100);

这可行,但会输出原始图像的质量较低且褪色的版本。 这是原始拆分旁边的示例:

当我也执行调整大小时会发生这种情况,但我想保持原始图像的相同颜色/质量。

有人对我如何实现这一点有任何想法吗?我的 php.ini 中是否有我丢失的设置或什么?我也尝试使用 imagepng() 但结果几乎相同。

我使用的是 PHP 版本 5.3.29,这是我来自 phpinfo() 的 GD 信息:

GD Support        : enabled
GD Version        : bundled (2.1.0 compatible)
FreeType Support  : enabled
FreeType Linkage  : with freetype
FreeType Version  : 2.3.11
T1Lib Support     : enabled
GIF Read Support  : enabled
GIF Create Support: enabled
JPEG Support      : enabled
libJPEG Version   : 6b
PNG Support       : enabled
libPNG Version    : 1.2.49
WBMP Support      : enabled
XPM Support       : enabled
libXpm Version    : 30411
XBM Support       : enabled

谢谢!

squeamish ossifrage的要求,这里是original fileconverted file

编辑 - 根据下面标记为正确的 squeamish ossifrage 的回答,我采取了以下步骤来解决问题:

在服务器上安装 exiftool

使用 PHP 生成以下命令:

exiftool -TagsFromFile "/var/www/vhosts/path/to/image/the file name.jpg" -icc_profile "/var/www/vhosts/path/to/image-processed/the file name.jpg"

使用 PHP 的 exec() 方法运行命令:

$arrOutput = array();
$return_var = "";
$directOutput = exec($exiftoolCommand, $arrOutput, $return_var);

工作就像一个魅力!

【问题讨论】:

  • 在不知道 WideImage 的情况下,我的第一个猜测是使用不同的 Chrome Subsampling,虽然这是一个简单的猜测,因为我真的不知道如何在 GD 中实现这一点,但结果即使质量相同,也绝对不同。
  • 发生这种情况是因为 imagecopyresampled() copies a rectangular portion of one image to another image, smoothly interpolating pixel values。您可以改用imagecopy()imagecopyresize(),但我认为不会更好,因为会发生固有的重新编码。
  • 是否建议改用 ImageMagick?
  • @bbeckford 你可以试试,但我没有太多使用 ImageMagick,所以我不能告诉你会发生什么。归根结底,使用不同的程序(甚至是 photoshop 和paint.net)处理相同的图像会根据其编码器的质量产生不同的结果。在这种情况下,您需要同时使用 GD 和 ImageMagick 进行测试,看看是否可以获得您想要的结果。 (或者也许改用像 PNG 这样“有损”的东西。)
  • 你能提供原始图像和GD输出的链接吗?也许您的原始文件包含带有colour space information 的EXIF 数据,在GD 处理图像时会丢失。

标签: php image-processing jpeg gd


【解决方案1】:

原始图像包含 ICC 颜色配置文件。 GD 对颜色配置文件一无所知,因此转换后的文件中缺少此信息。要解决此问题,您基本上有两种选择:

  1. 保存没有颜色配置文件的原始文件,或者

  2. 将颜色配置文件从原始文件复制到转换后的文件。

如果您打算在网络上发布此文件,我会选择选项 1,因为颜色配置文件和其他 EXIF 信息会无缘无故地占用带宽。

或者,您可以使用exiftool 等免费工具将颜色配置文件从一个文件复制到另一个文件。这应该在命令行上工作:

exiftool -TagsFromFile so_original.jpg -icc_profile so_converted.jpg

【讨论】:

  • exiftool 就像一个魅力!谢谢@squeamishossifrage!我已经发布了我在问题中使用的代码。
  • 请注意,其他程序也会出现此问题,尤其是 JPEG 2000。dlib.org/dlib/may11/vanderknijff/05vanderknijff.html ImageMagick 然而,正确地保留 JPEG 文件上的 ICC 配置文件。
猜你喜欢
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多