【问题标题】:Change one color of a CMYK image更改 CMYK 图像的一种颜色
【发布时间】:2018-05-29 08:25:32
【问题描述】:

我有一个 RGB 格式的图像,可以像这样转换为 CMYK:

$img->transformimagecolorspace(Imagick::COLORSPACE_RGB);

但是现在,我想将图像的所有白色部分转换为另一种颜色。所以 cmyk=0%,0%,0%,0% 到 cmyk=0%,0%,3%,0%。但我不希望转换整个图像,只转换白色部分。

请问我该怎么办?

【问题讨论】:

  • $img->transformimagecolorspace(Imagick::COLORSPACE_RGB); 不会转换为 CMYK,它会转换为 RGB(因为您显然在传递 RGB)。见php.net/manual/de/imagick.transformimagecolorspace.php。
  • @FabianSchöner 但是当我使用 COLORSPACE_CMYK 时,它不会改变任何东西:/

标签: php imagick cmyk


【解决方案1】:

有很多方法可以实现这一目标。例如FX expressions 或Imagick::opaquePaintImage。

如果您刚开始使用光栅图像,我建议您使用像素迭代器。

$img = new Imagick('wizard:');
// Force CMYK color channels.
$img->transformImageColorspace(Imagick::COLORSPACE_CMYK);
// Calculate `3%' once.
$yellowValue = $img->getQuantum() * 0.03;
// Copy pixel data into an iterator.
$pixelIter = $img->getPixelIterator();
// Iterate over pixel rows.
foreach($pixelIter as $row) {
  // Iterate over pixels.
  foreach($row as $pixel) {
    /*
       We can call `ImagickPixel::isPixelSimilar', but it might be quckier to
       use an accumulator.
     */
    $sumOfColors = $pixel->getColorValue(Imagick::COLOR_CYAN)
                 + $pixel->getColorValue(Imagick::COLOR_MAGENTA)
                 + $pixel->getColorValue(Imagick::COLOR_YELLOW)
                 + $pixel->getColorValue(Imagick::COLOR_BLACK);
    if ($sumOfColors == 0.0) { // Is `WHITE'?
       $pixel->setColorValueQuantum(Imagick::COLOR_YELLOW, $yellowValue);
    }
  }
  // Copy values back to image.
  $pixelIter->syncIterator();
}

请注意,我们正在根据量子颜色计算和设置 3% 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多