Подтвердить что ты не робот

Imagick: сочинять с маской

Я пытаюсь воссоздать script, который использует команду ImageMagick "convert" для создания изображения. Но я хочу сделать то же самое в PHP, используя Imagick (версия 6.6.2-10).

Команда выглядит следующим образом:

convert A1.mpc A3.mpc A4.mpc -channel rgba -alpha on -virtual-pixel background -background none -define compose:args=312x26.6776 -compose displace -composite out.mpc

Я выяснил, что параметры означают следующее:

convert  {background} {overlay} [{mask}] [-compose {method}] -composite {result}

PHP Imagick дает мне метод компоновки, но без параметра маски: http://www.php.net/manual/en/imagick.compositeimage.php

Я нашел еще один вопрос и пытается это сделать (но не приводит к тому же изображению):

// load images
$a1 = new Imagick('a1.png');
$a3 = new Imagick('a3.png');
$a4 = new Imagick('a4.png');

// mask the overlay
$a1->compositeImage($a4, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA);

// compose overlay to background
$a1->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_BACKGROUND);
$a1->setImageBackgroundColor(new ImagickPixel('none'));
$a1->setOption('compose:args', '312x26.6776');
$a1->compositeImage($a3, Imagick::COMPOSITE_DISPLACE, 0, 0);

Итак, мой вопрос: правильно ли это создать изображение с помощью маски? Или что здесь не так?

Чтобы визуализировать то, что я хочу сделать, вот несколько исходных изображений:

входное изображение a1 (фон):

a1

входное изображение a3 (наложение):

a3

входное изображение a4 (маска):

a4

Я хочу, чтобы результат был следующим:

correct output

Что создает мой PHP-код:

wrong output

Спасибо заранее! Майкл

4b9b3361

Ответ 1

После борьбы с этим я наконец нашел способ сделать это правильно с помощью PHP-Imagick.

// merge x-displacement and y-displacement into one displacement-map
$displaceMask = new Imagick();
$displaceMask->addImage($a3);
$displaceMask->addImage($a4);
$displaceMask->addImage($a4);
$displaceMask->flattenImages();
$displaceMask = $displaceMask->combineImages(Imagick::CHANNEL_ALL);

$displaceMask->setImageArtifact('compose:args', '312x26.6776');
$a1->compositeImage($displaceMask, Imagick::COMPOSITE_DISPLACE, 0, 0);

Ресурсы, которые я использовал:

Ответ 2

попробуйте использовать метод complexImage и Imagick:: COMPOSITE_COPYOPACITY

Ответ 3

Попробуйте этот код:

// x-displacement
$a3->setImageArtifact('compose:args', "312x0");
$a1->compositeImage($a3, Imagick::COMPOSITE_DISPLACE, 0, 0);

// y-displacement
$a4->setImageArtifact('compose:args', "0x26.6776");
$a1->compositeImage($a4, Imagick::COMPOSITE_DISPLACE, 0, 0); 

Ответ 4

Я не знаю, поможет ли это, но я обработал ваши изображения в ImageMagick 6.9.10.62 и 6.9.10.5 Q16 Mac OSX с тем же результатом, как показано ниже.

Так что, если есть проблема, скорее всего, с Imagick.

Какой была ваша точная версия 6.9.10.x?

convert img.png \
\( dx.png dy.png dy.png -combine \) \
-define compose:args=312x26.6776 -compose displace -composite \
result.png


enter image description here

Я замечаю, что если для dy комбинируется одно и то же изображение dx, я получаю результат, аналогичный вашему плохому результату. Это может означать, что либо addImage, либо flattenImage, либо combImage работают неправильно в вашем новом Imagick.

convert img.png \
\( dx.png dx.png dy.png -combine \) \
-define compose:args=312x26.6776 -compose displace -composite \
result2.png


enter image description here

Проверьте свой код, чтобы убедиться, что у вас нет опечатки с использованием $ a3, $ a3 и $ a3 или $ a4 для вашего addImage.

Для теста попробуйте PHP

exec("convert img.png \( dx.png dy.png dy.png -combine \) -define compose:args=312x26.6776 -compose displace -composite result.png")