我制作了一个工具,人们可以在其中上传照片并对其进行修改,包括去饱和度,从而产生灰度图像。我使用 PHP 的 GD 库生成最终图像。
打印这些图像时,颜色显示错误,因此使用图像魔术添加颜色配置文件。
除了灰度图像外,这效果很好。添加了颜色配置文件,但是当我在 Photoshop 中打开图像时,它说"无法使用嵌入的 ICC 配置文件,因为 ICC 配置文件无效。忽略配置文件"。在Photoshop中,图像设置为灰度而不是RGB,因此附加的RGB配置文件是错误的。我需要它是 RGB。
我使用以下代码添加所有可能的信息,以尝试使图像RGB:
<?php
$i = new Imagick();
$i->readimage('image.jpg');
$i->setimagetype(Imagick::IMGTYPE_TRUECOLOR);
$i->setimagecolorspace(Imagick::COLORSPACE_RGB);
$i->profileimage('icc', file_get_contents('AdobeRGB1998.icc'));
$i->writeimage($d);
$i->destroy();
?>
有谁知道如何成功将图像设置为 RGB 并附加配置文件?
我确实尝试了"setImageProfile"和"profileImage"的不同方法和组合,也适用于色彩空间和图像类型,但结果总是相同的。
@a34z在评论中说:
"不知何故,我必须让PS知道这是一个RGB图像,里面只有灰色像素或类似的东西。
假设RGB图像甚至可能包含这样的"灰色"像素是一个根本错误!
RGB 图像确实具有始终由 3 种颜色混合组成的像素:R ed + G reen + B lue。这些是可用的 3 个频道,仅此而已。RGB 中没有灰色通道这样的东西。
使RGB图像在我们眼中看起来灰色的原因是,3个数字通道值中的每一个都相等或不太严格,至少"足够相似"。当然,也有软件可以分析3个通道的颜色值,并告诉您哪些像素是"灰色"的。ImageMagick的直方图输出会很乐意告诉你你会说哪些灰色阴影,并为这些灰色使用不同的名称。但不要被这个颜色名称所迷惑:像素仍将由3种具有相同(或非常相似)强度的颜色组成,ImageMagick也会报告这些值。
如果您确实需要纯灰度图像(仅使用一个通道作为灰度级别,而不是三个通道),则必须将其转换为此类图像类型。
这两个图像可能看起来仍然相同(如果转换正确完成,如果您的显示器已校准,并且如果您不是红绿盲) - 但它们的内部文件结构不同。
RGB 图像需要处理 RGB(如果有)的 ICC 配置文件,例如 sRGB。对于灰度,您不能使用sRGB,您可能想使用DeviceGray或其他东西...
这对我有用,使它被识别为真彩色图像。假设$img
是包含灰度图像的 Imagick 对象,我检查它是否确实是灰度,然后编辑 1 个随机像素并通过添加或减去 5 个值来修改其红色值,具体取决于红色是否大于 5。
<?php
if ($img->getImageType() == Imagick::IMGTYPE_GRAYSCALE)
{
// Get the image dimensions
$dim = $img->getimagegeometry();
// Pick a random pixel
$x = rand(0, $dim['width']-1);
$y = rand(0, $dim['height']-1);
// Define our marge
$marge = 5;
//$x = 0;
//$y = 0;
// Debug info
echo "rnTransform greyscale to true colorrn";
echo "Pixel [$x,$y]n";
// Get the pixel from the image and get its color value
$pixel = $img->getimagepixelcolor($x, $x);
$color = $pixel->getcolor();
array_pop($color); // remove alpha value
// Determine old color for debug
$oldColor = 'rgb(' . implode(',',$color) . ')';
// Set new red value
$color['r'] = $color['r'] >= $marge ? $color['r']-$marge : $color['r'] + $marge;
// Build new color string
$newColor = 'rgb(' . implode(',',$color) . ')';
// Set the pixel's new color value
$pixel->setcolor($newColor);
echo "$oldColor -> $newColorrnrn";
// Draw the pixel on the image using an ImagickDraw object on the given coordinates
$draw = new ImagickDraw();
$draw->setfillcolor($pixel);
$draw->point($x, $y);
$img->drawimage($draw);
// Done,
unset($draw, $pixel);
}
// Do other stuff with $img here
?>
希望这对将来的任何人都有帮助。