仅替换PNG的背景颜色

时间:2016-10-08 04:18:49

标签: 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 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

它基于此代码段:https://snippets.aktagon.com/snippets/558-how-to-remove-a-background-with-imagemagick

从这开始:

Black circle filled with blue, blue background

我想得到这个:

Black circle filled with blue, green background

不是这个:

Black circle filled with green, green background

我可以使用单个convert命令而不是convert后跟mogrify来实现此目的吗?

我正在使用ImageMagick 6.8.9-9。

1 个答案:

答案 0 :(得分:3)

基本上,您正在寻找“floodfill”,如下所示:

convert in.png -fill green  -draw 'color 0,0 floodfill' result.png

enter image description here

这将查看左上角的像素(0,0),并用绿色填充与其连接的所有类似颜色的像素 。如果您的背景略有不同,例如它是一个JPEG,添加一些模糊因子

convert in.jpg -fuzz 25% ...

请注意,如果您的圆圈触及了顶部和底部边缘,则会阻止填充物溢出到图表的右侧。所以,假设你创建了这样的圈子:

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

enter image description here

然后你运行上面的命令,你会得到:

enter image description here

如果发生这种情况,你可以一直添加一个像素宽的边框,以便将颜色添加到“flow”,然后进行泛洪填充,最后将其删除:

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