版本更新后通过 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);
我让代码 运行 通过 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);