ImageMagick:将一张图像的 4 个边缘并排合成到另一张图像中

Posted

技术标签:

【中文标题】ImageMagick:将一张图像的 4 个边缘并排合成到另一张图像中【英文标题】:ImageMagick: composite 4 edges from one image into another, side-by-side 【发布时间】:2021-09-08 15:26:36 【问题描述】:

我正在使用 Perl 5.16 和 ImageMagick 6.8(现在可能已经过时了,但它可以工作:)。我正在尝试从一张图像中提取所有 4 个边缘区域,并将它们并排、垂直地合成到另一张图像中。

我可以提取边缘并旋转它们,但我无法正确获得目标图像中的偏移量。边缘最终彼此重叠。我试过 x=>$marg, translate=>"$marg,0", 有偏移的几何:没有骰子。变量:$marg = 边缘宽度,$im = 源,$im2 = 目标,$ext = 提取区域

# left edge
$ext=sprintf("%dx%d+%d+%d",$marg,$h,0,0);
$res=$im2->Composite(image=>$im,compose=>Over,extract=>$ext);

# top edge
$ext=sprintf("%dx%d+%d+%d",$w,$marg,0,0);
$geo=sprintf("%dx%d+%d+%d",$marg,$h,0,0);
$res=$im2->Composite(image=>$im,compose=>Over,extract=>$ext,rotate=>90,translate=>"$marg,0");

【问题讨论】:

【参考方案1】:

我已经很多年没有使用 PerlMagick 绑定了,但我想您会想要创建 4 个边缘条中的每一个,然后使用 +append 将它们水平并排放置。这是一个粗略的例子,就在终端中:

magick -size 20x50 xc:red xc:lime xc:blue +append result.png

更具体地解决您的问题,并从这张图片开始:

看起来像这样:

#!/bin/bash

magick ~/sample/images/blocks-RGB.png -resize 100x100 +repage -write MPR:orig +delete \
    \( MPR:orig -gravity northwest -crop 30x+0+0 \) \
    \( MPR:orig -gravity northwest -crop x30+0+0 -rotate 90 \) \
    \( MPR:orig -gravity southwest -crop x30+0+0 -rotate 90 \) \
    \( MPR:orig -gravity northeast -crop 30x+0+0 \) \
    +append result.png
    

希望您能看到与 PerlMagick 的相似之处。第一行创建要使用的图像副本,第二行裁剪左边缘,第三行裁剪上边缘,第四行裁剪下边缘,第五行裁剪右边缘,最后一行 并排附加四个裁剪的部分。

【讨论】:

谢谢。我想我可以把它“翻译”成 Perl。我假设逻辑如下:“重新分页”的意思是“为每个操作创建一个新的原始副本”(然后删除原始副本)。以下 4 个裁剪操作提取每个副本中的相应边缘。然后“附加”就是将它们并排放置在目标中。 差不多了。 repage 表示“忘记任何虚拟画布和偏移”MPR 是一个 "Magick Persistent Register",它只是一个命名的内存块,我将原始图像保存在其中,而不是继续去磁盘重新加载 4 个裁剪中的每一个的起始图像。

以上是关于ImageMagick:将一张图像的 4 个边缘并排合成到另一张图像中的主要内容,如果未能解决你的问题,请参考以下文章

用MATLAB将一幅图分割成4*3的小块该怎么做呢?

带有剪切路径的 imagemagick 锯齿边缘

Imagemagick convert -fill不会更改特定调色板区域的边缘

Imagemagick合并图片批处理

使用 ImageMagick 将 PNG 文件转换为 PDF 时出现粗糙的边缘

使用 PHP GD 将一张图像与另一张图像屏蔽