У меня есть изображение в RGB, которое я конвертирую в CMYK следующим образом:
$img->transformimagecolorspace(Imagick::COLORSPACE_RGB);
Но теперь я хочу преобразовать все белые части изображения в другой цвет. Так
= 0 CMYK%, 0%, 0%, 0% в = 0 CMYK%, 0%, 3%, 0%. Но я не хочу, чтобы конвертировалось все изображение, только белые части.
Как я должен сделать, пожалуйста?
Есть много способов достичь этого. 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%
значение против квантового цвета.
Других решений пока нет …