3

我制作了一个工具,人们可以上传照片并对其进行修改,包括去饱和度,从而产生灰度图像。我使用 PHP 的 GD 库生成最终图像。

打印这些图像时,颜色出现错误,因此使用 Image Magick 我添加了颜色配置文件。

除了灰度化的图像外,这非常有用。添加了颜色配置文件,但是当我在 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”尝试了不同的方法和组合,也用于颜色空间和图像类型,但结果总是一样的。

4

2 回答 2

2

这对我有用,可以将其识别为真彩色图像。假设$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 "\r\nTransform greyscale to true color\r\n";
    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 -> $newColor\r\n\r\n";

    // 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
?>

希望这对将来的任何人都有帮助。

于 2012-08-06T13:06:32.407 回答
2

@a34z 在评论中说:

“不知何故,我必须让 PS 知道它是一个 RGB 图像,其中只有灰色像素或类似的东西。”

假设 RGB 图像甚至可能包含“灰色”像素,这是一个基本错误!

RGB 图像确实具有始终由 3种颜色混合组成的像素:R ed + G reen + B lue。这些是可用的 3 个频道,仅此而已。RGB 中没有灰色通道。

使 RGB 图像在我们眼中看起来是灰色的原因是 3 个数字通道值中的每一个都相等或不太严格,至少“足够相似”。当然,也有软件可以分析 3 个通道的颜色值,告诉你哪些像素是“灰色”的。ImageMagick 的直方图输出会很高兴地告诉您您会说哪些灰色阴影,并为这些灰色使用不同的名称。但是不要被那个颜色名称所迷惑:像素仍然由具有相同(或非常相似)强度的 3 种颜色组成,并且 ImageMagick 也会报告这些值。

如果你真的需要一个纯灰度图像(灰度级只使用一个通道,而不是三个),那么你必须将它转换为这样的图像类型。

The two images may still look the same (if the conversion was done correctly, and if your monitor is calibrated, and if your not red-green-blind) -- but their internal file structure is different.

RGB images need ICC profiles that deal with RGB (if any), such as sRGB. For grayscale you cannot use sRGB, there you may want to use DeviceGray or something...

于 2012-08-06T21:29:38.837 回答