Как использовать Imagick для слияния и маскировки изображений?

Я очень мало разбираюсь в обработке изображений и даже меньше использую терминологию, поэтому, пожалуйста, несите меня.

В принципе, я хочу объединить два изображения вместе, где один из них будет действовать как маска. Это изображение выглядит примерно так: Example
Где синий и желтый фон в действительности прозрачны.

Это изображение используется в качестве маски для обычных фотографий. Части фотографии, которые "торчат" из круга, должны быть "обрезаны" (быть невидимыми), в то время как внутренняя часть остается видимой.
Итак, все, что приходит в синюю область, невидимо, все в желтой области видимо.

Я честно не знаю, как это сделать, поэтому любая помощь будет очень признательна!

Edit:
Я использую версию API Imagick, а не версию командной строки

Edit:
Чтобы получить представление о том, чего я хочу достичь, вот пример.

Входные изображения: enter image description here
Это изображение маски, всегда одно и то же

enter image description here
Это пример изображения, динамического

enter image description here
Это то, что конечный результат должен выглядеть как

Ответ 1

Итак, наконец, это должно сделать то, что вам нужно:

Исходное изображение:

http://i.stack.imgur.com/b7seR.png

Маска непрозрачности:

enter image description here

Overlay:

http://i.stack.imgur.com/3ulkM.png

Вывод:

enter image description here

Код:

<?php
$base = new Imagick('U0R4F.png');
$mask = new Imagick('mask.png');
$over = new Imagick('3ulkM.png');

// Setting same size for all images
$base->resizeImage(274, 275, Imagick::FILTER_LANCZOS, 1);

// Copy opacity mask
$base->compositeImage($mask, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA);

// Add overlay
$base->compositeImage($over, Imagick::COMPOSITE_DEFAULT, 0, 0);

$base->writeImage('output.png');
header("Content-Type: image/png");

echo $base;
?>

Я надеюсь, что это прямо сейчас! Примечание. В вашем примере это похоже на то, что вы уменьшили масштабное изображение, которое у меня не было (моя цель - просто показать, как выполняется маскировка).

Ответ 2

Вы попробовали это решение здесь, как описано в: fooobar.com/questions/207668/...?

Запустите это на своем сервере (с правильными именами изображений!) и сообщите нам, спасибо.

nb: кредиты переходят к jspash

Ответ 3

http://www.imagemagick.org/Usage/compose/#dstin должен сделать трюк, но вам нужно использовать изображения с альфа-каналами (это не должно быть проблемой).

Изменить: в PHP вам необходимо передать его (imagick::COMPOSITE_DSTIN) в качестве параметра в compositeimage. Другие фильтры в Composite Operator Constants также могут быть вам полезны.

Ответ 4

Этот тип маскировки рассматривается с использованием ряда различных методов в Примеры ImageMagick, миниатюр, масок и красок  http://www.imagemagick.org/Usage/thumbnails/#mask_paint

Однако следует предупредить, что маскировка и края наложенного изображения НЕ ДОПУСКАЕТСЯ это важно или у вас могут возникнуть проблемы с эффектами краевого сглаживания, которые лучше всего избежать.

Извлечение альфа-маски кольца может быть выполнено с помощью операторов морфологии, чтобы уменьшить его до осевой линии, можно использовать для создания маски для любой случайной "кольцевой" формы. Примеры ImageMagick, скелеты с помощью Thinning и обрезка http://www.imagemagick.org/Usage/morphology/#thinning_skeleton

Энтони Тиссен Веб-мастер для примеров ImageMagick и Developer для ImageMagick

PS: хорошая фотография из Elfling