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

Javascript 裁剪边框内的图像(删除边框外的所有内容),javascript,imagemagick,Javascript,Imagemagick,我有一张六边形图片,上面有其他闭合六边形的零件。因为图像默认为正方形,但六边形是六边形。 看起来是这样的: 但我想删除边界外的三角形,以保持六边形背景透明。 我试过使用脚本并尝试了imagemagick命令的不同组合,其目标是扩展白色边框并将白色替换为透明。 convert base.png-fuzz 10%-trim+repage out.png magick base.png\(-clone 0-fuzz 15%填充白色+不透明白色-绘制“color$centx,$centy泛光填充

我有一张六边形图片,上面有其他闭合六边形的零件。因为图像默认为正方形,但六边形是六边形。 看起来是这样的:


但我想删除边界外的三角形,以保持六边形背景透明。

我试过使用脚本并尝试了imagemagick命令的不同组合,其目标是扩展白色边框并将白色替换为透明。
convert base.png-fuzz 10%-trim+repage out.png

magick base.png\(-clone 0-fuzz 15%填充白色+不透明白色-绘制“color$centx,$centy泛光填充”\)-alpha off-compose Src-composite out.png

composite-compose Src-gravity Center base.png-alpha set-out.png

根据答案,我使用了命令
magick base.png\(-clone 0-fuzz 15%-填充黑色+不透明“rgb(255255255)”-填充白色+不透明黑色-填充白色-绘制“color$centx,$centy floodfill”\)-alpha off-合成副本\u不透明-合成输出.png

但是什么都没用。

因此,我的问题是,如何扩展图像边框并替换背景色,或者如何裁剪边框内的图像但保留六边形形式?

在Mac OSX上使用Imagemagick 6.9.10.78,我得到以下结果:

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
输入:

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

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 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内置的“向导:”。将其替换为输入图像的文件名

接下来,它使用“+扭曲SRT”重新缩放遮罩,以适应输入图像中的最大可能大小。FX表达式并不像看上去那么复杂

它将重力设置为“中心”,将合成方法设置为“srcin”,因此合成结果将是从输入图像中冲出的中心六边形,并放置在透明背景上

“+扭曲”操作会在每一侧添加一行像素,因此该命令通过将周围的一个像素全部剃掉并写入输出文件来完成


上面的命令在带有im6.8.9-9的bashshell中工作。要与IMv7一起使用,请将“convert”命令更改为“magick”。要在Windows命令行上运行它,请将连续的行反斜杠“\”更改为插入符号“^”。

我提出的解决方案是进行一系列调用以更改图像。 这是经过修改和扩展的解决方案


因为我有很多图像,所以我编写了bash循环脚本,它一个接一个地处理每个图像,重新定义每个循环上的值。

感谢您提供的解决方案,但我无法让它工作。
在每个角落使用泛洪填充后
仍有小白线。我猜这种行为是由不同的ImageMagick版本(我使用7.0.9-8)引起的。但是谢谢你在这里所做的解决方案,我已经更新了它,在几次图像迭代中就可以达到预期的效果。你的标题有点让人困惑。但请看我在回答中添加的内容,以去除白色边框和角。感谢您提供的解决方案,但我已经有了hexagon,不需要再创建一个。如果您已经有了hexagon,请将其用作简单alpha合成的遮罩。在阅读输入图像之前,请忽略我的示例部分,而只是在那里阅读你的遮罩图像。这将使你的六边形遮罩形状冲出原始形状,并使角落保持透明。