Как использовать 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