版本更新后通过 Imagick 应用置换贴图

Apply displacement map via Imagick after version update

我让代码 运行 通过 ImageMagick v6.7.9 和 PHP(Imagick 扩展 v3.2.0)创建了一个 "cylinder" 效果,就像我的接受的答案中描述的那样上一个问题: It's inspired by Fred's cylinderize script: http://www.fmwconcepts.com/imagemagick/cylinderize/

创建 X/Y-displacements ($a3/$a4) 后,它的组合如下:

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

$displaceMask->setImageArtifact('compose:args', '1600x83.669513037752');
$image->compositeImage($displaceMask, Imagick::COMPOSITE_DISPLACE, 0, 0);
$image->trimImage(0);

现在我更新到 ImageMagick v6.9.10 和 Imagick v3.4.3,这不再生成相同的图像。我已经知道我必须改变创建置换贴图的方式,让它看起来和以前一样:

// merge x-displacement and y-displacement into one displacement-map
$displaceMask = new Imagick();
$displaceMask->newImage($a3->getImageWidth(), $a3->getImageHeight(), new ImagickPixel('white'));
$displaceMask->setImageFormat('png');
$displaceMask->setImageColorspace(Imagick::COLORSPACE_RGB);

$displaceMask->compositeImage($a3, imagick::COMPOSITE_COPYRED, 0, 0);
$displaceMask->compositeImage($a4, imagick::COMPOSITE_COPYGREEN, 0, 0);
$displaceMask->compositeImage($a4, imagick::COMPOSITE_COPYBLUE, 0, 0);

但是如果我现在将 "composite" 函数与 "displace" 运算符一起应用,结果看起来与旧版本不一样:

$displaceMask->setImageArtifact('compose:args', '1600x83.669513037752');
$image->compositeImage($displaceMask, Imagick::COMPOSITE_DISPLACE, 0, 0);
$image->trimImage(0);

输入图片:

位移图:

预期结果图像(如版本更新前):

结果图像(即版本更新后):

我的猜测是 Imagick and/or ImageMagick 实现或其(默认)配置发生了任何变化。谁能指出解决方案?

提前致谢!

编辑: 我更新了输入图像,它不是我用作位移输入的图像。

Edit2:我试图通过 ImageMagick 直接而不是使用 Imagick 来应用位移,并且它似乎工作(忽略结果图像以某种方式像素化的事实,所以到目前为止,它不能用作解决方法):

convert input.png ( a3.png a4.png a4.png -combine ) -channel rgba -alpha on -virtual-pixel transparent -background none -define compose:args=1600x83.669513037752 -compose displace -composite result.png

--> 可能是 Imagick 本身的 problem/bug/change?

我无法使用 ImageMagick 6.9.10.62 或 6.7.8.9 重现您的结果。

两者的中心圆的边界都非常参差不齐。但直线并没有锯齿状,这令人费解。您需要下载图像并以全分辨率查看以查看它们的锯齿程度。

你是如何创建置换贴图的?我认为这是您问题的根源——它太粗糙,即不够平滑。它是每像素每通道 8 位,对于这么大的图像需要保存为 16 位甚至更高。

convert img.png displace.png \
-channel rgba -alpha on -virtual-pixel transparent -background none \
-define compose:args=1600x83 -compose displace -composite result.png


来自 IM 6.9.10.62 的结果:

来自 IM 6.7.8.9 的结果:

我认为问题出在我使用的版本之间的 ImageMagick and/or Imagick PHP 扩展中的变化。我在 ImageMagick 的变更日志中发现了这个问题:https://github.com/ImageMagick/ImageMagick/issues/597 这里更进一步是他们前段时间所做的实际更改:https://github.com/ImageMagick/ImageMagick/commit/87be42439e1df8c51e7af5ea5d6591a8af499cf2

--> 为了解决这个问题,我不得不在源图像上而不是置换贴图上设置合成参数。然后它再次工作正常,即使没有锯齿线(我通过命令行尝试时也有它们)。

所以不用

$displaceMask->setImageArtifact('compose:args', '1600x83.669513037752');
$image->compositeImage($displaceMask, Imagick::COMPOSITE_DISPLACE, 0, 0);

我不得不这样做:

$image->setImageArtifact('compose:args', '1600x83.669513037752');
$image->compositeImage($displaceMask, Imagick::COMPOSITE_DISPLACE, 0, 0);