Imagemagick 仅替换PNG的背景色

Imagemagick 仅替换PNG的背景色,imagemagick,imagemagick-convert,Imagemagick,Imagemagick Convert,这是我的密码: #! /usr/bin/env sh # Generate test image. convert -size 100x60 xc:blue -fill blue -stroke black -draw "circle 50,30 55,55" in.png # Make background transparent. convert in.png -fill none -draw 'matte 0,0 floodfill' -flop -draw 'matte 0,0 fl

这是我的密码:

#! /usr/bin/env sh
# Generate test image.
convert -size 100x60 xc:blue -fill blue -stroke black -draw "circle 50,30 55,55" in.png

# Make background transparent.
convert in.png -fill none -draw 'matte 0,0 floodfill' -flop  -draw 'matte 0,0 floodfill' -flop out.png
# Replace transparent background with green.
mogrify -background green -flatten out.png

# The wrong way.
convert in.png -transparent blue oops.png
mogrify -background green -flatten oops.png
它基于以下代码段:

从这一点开始:

我想得到这个:

不是这个:

我可以用一个
convert
命令而不是
convert
后跟
mogrify
来实现这一点吗


我使用的是ImageMagick 6.8.9-9。

本质上,您是在寻找一种“泛洪填充”,如下所示:

convert in.png -fill green  -draw 'color 0,0 floodfill' result.png
convert -size 100x60 xc:blue -fill blue -stroke black -draw "circle 50,30 50,0" in.png

这将查看左上角的像素(
0,0
),并用绿色填充与之相连的所有颜色相似的像素。如果你的背景有轻微的变化,例如JPEG,添加一些模糊因子


请注意,如果您的圆接触了上边缘和下边缘,它将防止填充向图表右侧溢出。那么,假设您创建了这样的圆:

convert in.png -fill green  -draw 'color 0,0 floodfill' result.png
convert -size 100x60 xc:blue -fill blue -stroke black -draw "circle 50,30 50,0" in.png

然后运行上述命令,您将得到:

如果出现这种情况,您可以添加一个像素宽的边框,让颜色先“流动”,然后进行泛光填充,最后再将其删除:

convert in.png -bordercolor blue -border 1 -fill green  -draw 'color 0,0 floodfill' -shave 1x1 result.png

要使用透明度而不是颜色填充,请使用:
convert in.png-fill none-draw'color 0,0 floodfill'result.png