Как использовать Imagick для объединения и маскирования изображений? - PullRequest
25 голосов
/ 02 января 2012

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

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

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

Честно говоря, я понятия не имею, как это сделать, поэтому любая помощь будет принята с благодарностью!

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

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

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

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

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

Ответы [ 4 ]

62 голосов
/ 04 января 2012

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

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

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

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

enter image description here

Наложение:

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;
?>

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

1 голос
/ 04 января 2012

Вы пробовали это решение здесь, как описано: https://stackoverflow.com/a/2351173/1093649?

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

Примечание: кредиты идут на jspash

0 голосов
/ 24 апреля 2012

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

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

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

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

PS: хорошее фото от Эльфлинга

0 голосов
/ 04 января 2012

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

Редактировать: в PHP вы должны передать его (imagick::COMPOSITE_DSTIN) в качестве параметра в композитный образ . Другие фильтры в Составные операторные константы также могут быть вам полезны.

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