我尝试重新创建一个使用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为我提供了一个compose方法,但是没有mask参数:http://www.php.net/manual/en/imagick.compositeimage.php
我找到another question并尝试此操作(但不会生成相同的图片):
// 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(背景):
输入图像a3(叠加):
输入图像a4(蒙版):
我想要的结果是什么:
我的php代码创建的内容:
提前致谢! 迈克尔
答案 0 :(得分:3)
尝试使用compositeImage方法和Imagick :: COMPOSITE_COPYOPACITY
答案 1 :(得分:1)
试试这段代码:
// 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);
答案 2 :(得分: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);
我使用的资源:
答案 3 :(得分:1)
我不知道这是否有帮助,但是我在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
我注意到,如果将同一张图像dx合并为dy,那么我得到的结果类似于您的错误结果。这可能意味着在新的Imagick中,addImage或flattenImage或combineImage无法正常工作。
convert img.png \
\( dx.png dx.png dy.png -combine \) \
-define compose:args=312x26.6776 -compose displace -composite \
result2.png
检查您的代码,以确保您没有使用$ a3,$ a3和$ a3或$ a4作为输入图像的错字。
要进行测试,请尝试使用PHP
exec("convert img.png \( dx.png dy.png dy.png -combine \) -define compose:args=312x26.6776 -compose displace -composite result.png")