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]()
Спасибо заранее!
Майкл
Ответы
Ответ 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")