【问题标题】:Crop image inside border (remove everything outside)裁剪边框内的图像(删除外面的所有内容)
【发布时间】:2019-12-19 02:52:40
【问题描述】:

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


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

我尝试过使用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

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

【问题讨论】:

    标签: javascript imagemagick


    【解决方案1】:

    在 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。

    【讨论】:

    • 感谢您的解决方案,但我无法使其工作。在using floodfill at each corner 之后仍然有小白线。我猜这种行为是由不同的图像魔法版本引起的(我使用 7.0.9-8)。但是感谢您在这里提供的解决方案imagemagick.org/discourse-server/viewtopic.php?t=36543#p168067 我已经更新了它,并且在几次图像迭代中就可以达到预期的结果。
    • 你的标题有点混乱。但是请参阅我的答案中的添加以摆脱白色边框和角落。
    【解决方案2】:

    使用 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”操作会在每一侧添加一行像素,因此该命令通过一直刮掉一个像素并写入输出文件来完成。

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

    【讨论】:

    • 感谢您的解决方案,但我已经有了六边形,不需要再创建一个。
    • 如果您已经有了六边形,请将其用作简单 Alpha 合成的蒙版。在读入输入图像之前忽略我的示例部分,而只是在那里读入你的蒙版图像。这会将你的六边形蒙版形状从原始图像中冲出,并使角落保持透明。
    【解决方案3】:

    我想出的解决方案是进行一系列调用来更改图像。 这是修改和扩展的解决方案提供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 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多