Установите прозрачный фон с помощью ImageMagick и командной строки.

Предположим, что у вас есть изображение (PNG или JPG). Это изображение имеет белый фон, и мне нужно сделать этот фон прозрачным.

Я попытался с этими примерами:

  • convert original.png -background none transparent.png
  • convert original.png -background white -flatten -alpha off transparent.png

но без желаемых результатов.

Как я могу это сделать?

ВАЖНО: использование командной строки convert.

Ответ 1

Я использую ImageMagick 6.6.9-7 на Ubuntu 12.04.
Что для меня работало:

convert test.png -transparent white transparent.png

Это изменило все белые в test.png на прозрачные.

Ответ 2

У меня была та же проблема. В котором мне нужно удалить белый фон из формата jpg/png с помощью ImageMagick.

Что для меня работало:

1) Преобразование формата изображения в png: convert input.jpg input.png

2) convert input.png -fuzz 2% -transparent white output.png

Ответ 3

Это работает для меня:

convert original.png -fuzz 10% -transparent white transparent.png

где чем меньше fuzz%, тем ближе к истинному белому или наоборот, чем больше%, тем больше отклонение от белого становится прозрачным.

Ответ 4

Вы можете использовать это, чтобы сделать фоновый прозрачный

convert test.png -background rgba(0,0,0,0) test1.png

Вышеприведенный дает прозрачный фон префекта

Ответ 5

Решение

color=$( convert filename.png -format "%[pixel:p{0,0}]" info:- )
convert filename.png -alpha off -bordercolor $color -border 1 \
    \( +clone -fuzz 30% -fill none -floodfill +0+0 $color \
       -alpha extract -geometry 200% -blur 0x0.5 \
       -morphology erode square:1 -geometry 50% \) \
    -compose CopyOpacity -composite -shave 1 outputfilename.png

Объяснение

Это немного дольше, чем простые ответы, но он дает лучшие результаты : (1) Качество превосходит должное для сглаженной альфы, и (2) только фон удаляется как против одного цвета. ( "Фон" определяется как приблизительно того же цвета, что и верхний левый пиксель, используя заливку от края изображения.)

Кроме того, альфа-канал также разрушается на половину пикселя, чтобы избежать гало. Конечно, морфологические операции ImageMagick (пока?) Работают на уровне субпикселя, поэтому вы можете видеть, что я раздуваю альфа-канал до 200% до размывания.

Сравнение результатов

Вот сравнение простого подхода ("-fuzz 2% -прозрачный белый ") по сравнению с моим решением, когда Логотип ImageMagick. Я сплющил оба прозрачных изображения на седло-коричневом фоне, чтобы сделать различия в различиях (нажмите для оригиналов).

The simple replacement of white as transparent doesn't always work Antialiased alphachannel and floodfill looks much better

Обратите внимание, что борода мастера исчезла в простом подходе. Сравните грани мастера, чтобы увидеть, как сглаженная альфа помогает плавно перемещайтесь в фоновом режиме.

Конечно, я полностью признаю, что есть моменты, когда вы, возможно, захотите использовать более простое решение. (Например: это намного проще помните, и если вы конвертируете в GIF, вы ограничены 1-битным alpha так или иначе.)

mktrans shell script

Так как маловероятно, вам нужно будет повторно набирать эту команду, я рекомендуется обернуть его в script. Вы можете загрузить оболочку BASH script от github, который выполняет мое предложенное решение. Он может запускаться на нескольких файлах в и содержит полезные комментарии, если вы хотите настраивать вещи.

bg_removal script

Кстати, ImageMagick на самом деле поставляется с script, называемым "bg_removal" который использует заливку так же, как и мое решение. Однако результаты невелики, потому что он все еще использует 1-битную альфу. Так же bg_removal script работает медленнее и немного сложнее использовать (он требует, чтобы вы указали два разных значения fuzz). Здесь приведен пример вывода из bg_removal.

The bg_removal script: has beard, but lacks antialiasing

Ответ 6

Если вы хотите контролировать уровень прозрачности, вы можете использовать rgba. где a - альфа. 0 для прозрачных и 1 для непрозрачных. Убедитесь, что окончательный выходной файл должен иметь расширение .png для прозрачности.

convert 
  test.png 
    -channel rgba 
    -matte 
    -fuzz 40% 
    -fill "rgba(255,255,255,0.5)" 
    -opaque "rgb(255,255,255)" 
       semi_transparent.png

Ответ 7

Используя ImageMagick, это очень похоже на код и результат hackerb9, но это немного упрощенная командная строка. Он предполагает, что верхний левый пиксель является цветом фона. Я просто заливаю фон прозрачностью, затем выбираю альфа-канал и размываю его и удаляю половину размытой области с использованием уровня 50х100%. Затем поверните назад все каналы и прижмите его к коричневому цвету. Уровень -blur 0x1-level 50x100% действует на антиалиасы границ прозрачности альфа-канала. Вы можете отрегулировать значение fuzz, значение размытия и значение уровня 50%, чтобы изменить степень сглаживания.

convert logo: -fuzz 25% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg

введите описание изображения здесь

Ответ 8

Угу. С этой же проблемой тоже. Вот команда, которую я запускал, и она отлично работала: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico