Установить прозрачный фон с помощью ImageMagick и командной строки - PullRequest
102 голосов
/ 06 февраля 2012

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

Я пробовал с этими примерами:

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

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

Как мне это сделать?

ВАЖНО: используя convert командную строку.

Ответы [ 8 ]

122 голосов
/ 20 июня 2012

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

convert test.png -transparent white transparent.png

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

69 голосов
/ 10 мая 2013

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

То, что мне помогло, было:

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

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

31 голосов
/ 14 июня 2017

Решение

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-битным альфа во всяком случае.)

сценарий оболочки mktrans

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

bg_removal script

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

The bg_removal script: has beard, but lacks antialiasing

25 голосов
/ 01 июля 2014

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

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

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

11 голосов
/ 29 января 2014

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

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

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

5 голосов
/ 14 июня 2017

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

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

enter image description here

4 голосов
/ 23 января 2015

Если вы хотите контролировать уровень прозрачности, вы можете использовать rgba. где альфа. 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
1 голос
/ 14 октября 2015

Да. Была такая же проблема тоже. Вот команда, которую я выполнил, и она отлично работала: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico

...