PHP图像处理GD JPEG质量

时间:2014-09-16 10:50:43

标签: php image-processing jpeg gd

我开始使用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);

这样可以,但输出质量较低的原始图像更多的褪色版本。 下面是原始拆分中心旁边的示例:

Example Image

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

有没有人对如何实现这一点有任何想法?我的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);

像魅力一样工作!

1 个答案:

答案 0 :(得分:6)

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

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

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

  3. 如果您计划在网络上发布此文件,我会选择选项1,因为颜色配置文件和其他EXIF信息会毫无理由地占用带宽。

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

    exiftool -TagsFromFile so_original.jpg -icc_profile so_converted.jpg