16

我尝试重新创建一个使用 ImageMagick 命令“转换”来组成图像的脚本。但我想使用 Imagick(版本 6.6.2-10)在 PHP 中做同样的事情。

命令如下:

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 方法,但没有掩码参数: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

我想要的结果是:

正确的输出

我的 php 代码创建了什么:

错误的输出

提前致谢!迈克尔

4

4 回答 4

3

尝试使用 CompositeImage 方法和 Imagick::COMPOSITE_COPYOPACITY

于 2012-11-27T14:46:01.553 回答
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


在此处输入图像描述

我注意到,如果为 dy 组合相同的图像 dx,那么我得到的结果类似于你的坏结果。这可能意味着 addImage 或 flattenImage 或 combineImage 在您的新 Imagick 中无法正常工作。

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


在此处输入图像描述

检查您的代码以确保您的 addImage 中没有使用 $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")
于 2019-08-30T06:16:21.990 回答
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); 
于 2017-10-26T09:46:05.143 回答
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);

我使用的资源:

于 2019-02-21T12:24:23.827 回答