在边框内裁剪图像(删除外面的所有内容)

Crop image inside border (remove everything outside)

我有六边形图像,其中包含其他紧密六边形的部分。因为默认情况下图像是方形的,但是六边形就是六边形。 它看起来像这样:


但是我想删除边界外的那些三角形以保持六边形具有透明背景。

我已经尝试使用 autotrim 脚本并尝试了 imagemagick 命令的不同组合,其目标是扩展白色边框并将白色替换为透明。
convert base.png -fuzz 10% -trim +repage out.png
magick base.png \( -clone 0 -fuzz 15% -fill white +opaque white -draw "color $centx,$centy floodfill" \) -alpha off -compose Src -composite out.png
composite -compose Src -gravity Center base.png -alpha set out.png
我使用了命令,基于 this answer
magick base.png \( -clone 0 -fuzz 15% -fill black +opaque "rgb(255,255,255)" -fill white +opaque black -fill white -draw "color $centx,$centy floodfill" \) -alpha off -compose copy_opacity -composite out.png

但没有任何效果。
所以,我的问题是,如何扩展图像边框并替换背景颜色或如何在边框内裁剪图像但保留六边形形式?

在 Mac OSX 上使用 Imagemagick 6.9.10.78,我得到以下信息:

输入:

使角落透明(在每个角落使用填充):

convert DB8m5.png -fill none -fuzz 95% \
-floodfill +0+0 black \
-rotate 90 -floodfill +0+0 black \
-rotate 90 -floodfill +0+0 black \
-rotate 90 -floodfill +0+0 black \
-rotate 90 \
result.png


裁剪到内部矩形:

convert DB8m5.png -bordercolor white -border 10 \
-define trim:percent-background=0% \
-define trim:background-color=white \
-trim +repage \
result2.png


添加:

如果您需要去除白色和角落,请执行以下操作:

convert DB8m5.png -fill white -fuzz 95% \
-floodfill +0+0 black \
-rotate 90 -floodfill +0+0 black \
-rotate 90 -floodfill +0+0 black \
-rotate 90 -floodfill +0+0 black \
-rotate 90 \
-bordercolor white -border 1 \
-fuzz 0 -fill none \
-floodfill +0+0 white \
-shave 1 \
result.png


对于 IM 7,使用 magick 代替 convert。

使用 ImageMagick v6 或 v7,您可以使用这样的命令从任何输入图像中裁剪出非常准确的六边形...

convert -size 1000x1155 xc:white \
   -background none -virtual-pixel none \
   -distort SRT 60 -distort SRT 60 \
   wizard: +distort SRT "%[fx:min(t?1:v.w/u.w,t?1:v.h/u.h)] 0" \
   -gravity center -compose srcin -composite -shave 1 hexout.png

首先创建一个蒙版,该蒙版以垂直六边形尺寸的白色矩形开始。它在透明背景上将矩形旋转 60 度几次以剪掉角落并制作六边形蒙版。

然后它读取输入图像。在这个例子中,我使用了内置的 IM "wizard:"。将其替换为输入图像的文件名。

接下来它使用“+distort SRT”重新缩放蒙版以适应输入图像内的最大可能尺寸。 FX 表达式并不像看起来那么复杂。

设置gravity为"center",compose方法为"srcin",所以合成的结果就是从输入图片中打孔出来的中心六边形,放置在透明背景上。

“+distort”操作在每一侧添加一行像素,因此该命令通过一路刮掉一个像素并写入输出文件来完成。

上面的命令在 bash shell 和 IM 6.8.9-9 中有效。要将它与 IMv7 一起使用,请将 "convert" 命令更改为 "magick"。 运行 它在 Windows 命令行上将续行反斜杠“\”更改为脱字符“^”。

我想到的解决方案是进行一系列调用来更改图像。 这是提供的修改和扩展解决方案 here

CENT_X="$(magick $filename -format "%[fx:w/2]" info:)"
CENT_Y="$(magick $filename -format "%[fx:h/2]" info:)"
magick $filename \( -clone 0 -fuzz 1% -fill black +opaque "rgb(255,255,255)" -fill white +opaque black -fill white -draw "color $CENT_X,$CENT_Y floodfill" \) -alpha off -compose copy_opacity -composite $filename_prep.png
convert $filename_prep.png -fuzz 10% -transparent white $filename

因为我有一堆图像,所以我编写了 bash 循环脚本,它逐一处理每张图像,并在每个循环中重新声明 CENT_X/CENT_Y 值。