仅替换 PNG 的背景颜色

Nat*_*ver 3 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
Run Code Online (Sandbox Code Playgroud)

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

从这个开始:

黑色圆圈填充蓝色,蓝色背景

我想得到这个:

充满蓝色、绿色背景的黑色圆圈

不是这个:

黑色圆圈充满绿色,绿色背景

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

我正在使用 ImageMagick 6.8.9-9。

Mar*_*ell 5

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

convert in.png -fill green  -draw 'color 0,0 floodfill' result.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

convert in.jpg -fuzz 25% ...
Run Code Online (Sandbox Code Playgroud)

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

convert -size 100x60 xc:blue -fill blue -stroke black -draw "circle 50,30 50,0" in.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

在此输入图像描述

如果发生这种情况,您可以在周围添加一个像素宽的边框,让颜色首先“流动”,然后填充,最后将其删除:

convert in.png -bordercolor blue -border 1 -fill green  -draw 'color 0,0 floodfill' -shave 1x1 result.png
Run Code Online (Sandbox Code Playgroud)