imagecreatefromstring 改变图像颜色

Posted

技术标签:

【中文标题】imagecreatefromstring 改变图像颜色【英文标题】:imagecreatefromstring changes image color 【发布时间】:2019-06-16 21:10:09 【问题描述】:

我在 php 中调整图像大小时遇到​​问题;似乎从我使用imagecreatefromstringimagecreatefrompng 加载图像的那一刻起,颜色就会改变并褪色。

我知道我必须使用imagecreatetruecolor 来创建目标图像,但我什至没有达到这一点。

这里有几个例子来解释我得到的结果:

// This results in a discolored / faded image
$image = imagecreatefrompng('/path/to/my/image.png');
header('Content-Type: image/png');
imagepng($image);
die();
// This also results in a discolored / faded image
$image = imagecreatefrompng('/path/to/my/image.png');
$info = getimagesize('/path/to/my/image.png');
$sourceWidth = $info[0];
$sourceHeight = $info[1];

$resizedImage = imagecreatetruecolor($sourceWidth, $sourceHeight);
imagecopyresampled($resizedImage, $image, 0, 0, 0, 0, $sourceWidth, $sourceHeight, $sourceWidth, $sourceHeight);

header('Content-Type: image/png');
imagepng($resizedImage);
die();
// Obviously, this works flawlessly.
header('Content-Type: image/png');
echo file_get_contents('/path/to/my/image.png');
die();

以下是之前和之后的示例:

显然,我一定遗漏了一些东西,但我查看了所有我能找到的 SO 问题和答案,但没有找到任何解决问题的方法。

你有没有遇到过这个问题? 我该怎么做呢?

【问题讨论】:

【参考方案1】:

此问题可能与颜色配置文件有关,因为 GD 似乎不支持颜色配置文件。例如,如果您的图像位于 Adob​​e RGB 颜色空间中,该颜色空间的颜色信息比 sRGB 多,则可能会发生这种情况。以下是有关该主题的更多信息:

https://devot-ee.com/add-ons/support/ce-image/viewthread/1085

一种可能的解决方案是使用 Photoshop 将图像转换为 sRGB(导出时有一个“转换为 sRGB”复选框)。

如果不可能,您可以使用ImageMagick 代替 GD,它(如上面链接中所述)确实支持颜色配置文件。

【讨论】:

该死的,你是对的。我不知道我怎么没想到要研究颜色配置文件支持,但就是这样。 GD 不支持颜色配置文件:它只是去除它们。然而,Imagick 确实支持它们(这解释了为什么到处都引用它!)。因此,我切换到 Imagick 的 cropThumbnailImage 来调整图像大小,同时保持我的初始处理的其余部分几乎相同。谢谢@ismael! 这篇文章已经两年多了;有谁知道GD是否仍然不支持颜色配置文件?在过去的几年里,包括 Chrome 在内的很多软件都增加了这种支持。目前我似乎无法找到一个直接的答案,而且我确实看到有一些多年前的功能请求要求向 GD 添加颜色配置文件支持。

以上是关于imagecreatefromstring 改变图像颜色的主要内容,如果未能解决你的问题,请参考以下文章

php之把两个图片合成

尝试使用 imagecreatefromstring 保存 base64 图像,它完全是黑色的

使用 imagecreatefromstring() 时 PHP 将图像导出为相同类型(PNG、JPG 等)

PHP imagecreatefromstring(): gd-jpeg, libjpeg: 可恢复的错误

php原生带码给图片添加水印及缩略图

php给图片加文字水印