2016-10-08 2 views
2

Вот мой код:Замените только цвет фона PNG

#! /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.

ответ

3

По сути, вы ищете "заливка", как это:

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

Если это произойдет, вы может добавить одну ширину пикселя в ширину, чтобы цвет до «поток» сначала, затем наводнение, и, наконец, удалите его позже:

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

Чтобы заполнить прозрачность вместо цвета, используйте: 'convert in.png -fill none -draw 'color 0,0 floodfill' result.png'. – Erik

Смежные вопросы