Как замаскировать изображение составным, но только там, где цвет черный - PullRequest
0 голосов
/ 29 января 2019

У меня есть mask.png:

mask

и некоторые другие изображения в формате png с такими же размерами:

image

Теперь я хотел бы замаскировать изображение с помощью mask.png, но только в том случае, если на изображении маски черный цвет.

Желаемый результат:

desired result

Что-токак это возможно с imagick, если да, то как?

1 Ответ

0 голосов
/ 29 января 2019

Это действительно сложный вопрос.Обычно для выделения черных цветов вы просто применяете композит SCREEN.

$image->compositeImage($mask, Imagick::COMPOSITE_SCREEN, 0, 0);

Но у рассматриваемой маски уже есть активный альфа-канал, так что может быть возможно, что прозрачныйзначения черного существуют и вызывают нежелательные эффекты.

Я бы предложил перестроить маску как новый альфа-канал цвета.То есть черно-белое изображение, где черный представляет полностью непрозрачный пиксель, а белый - полностью прозрачный пиксель.Затем скопируйте восстановленную маску как новый альфа-канал.

// Load resources.
$image = new Imagick('input.png');
$mask = new Imagick('mask.png');
// Create a white canvas.
$tempMask = new Imagick();
$tempMask->newPseudoImage($mask->width, $mask->height, 'XC:WHITE');
// Copy mask over canvas to replace transparent values.
$tempMask->compositeImage($mask, Imagick::COMPOSITE_ATOP, 0, 0);
// Invert colors.
$tempMask->negateImage(true);
// Copy temporary mask as the new alpha channel.
$image->compositeImage($tempMask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);
// Save results.
$image->writeImage('output.png');

output.png

...