Изменить один цвет изображения CMYK - PullRequest
0 голосов
/ 29 мая 2018

У меня есть изображение в RGB, которое я конвертирую в CMYK следующим образом:

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

Но теперь я хочу преобразовать все белые части изображения в другой цвет.Так cmyk = 0%, 0%, 0%, 0% до cmyk = 0%, 0%, 3%, 0% .Но я не хочу, чтобы конвертировалось все изображение, только белые части.

Как мне быть, пожалуйста?

1 Ответ

0 голосов
/ 29 мая 2018

Есть много способов достичь этого. FX выражения или 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% для квантового цвета.

Change one color of CMYK image

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...