Решение
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 . Я сгладил
оба прозрачных изображения на седло-коричневый фон, чтобы сделать
очевидные различия (нажмите для просмотра оригиналов).
Обратите внимание, как борода Волшебника исчезла при простом подходе.
Сравните края Волшебника, чтобы увидеть, как сглаженная альфа помогает
фигура плавно сливается с фоном.
Конечно, я полностью признаю, что иногда вы можете использовать
более простое решение. (Например: чертовски много проще
помните, и если вы конвертируете в GIF, вы ограничены 1-битным
альфа во всяком случае.)
сценарий оболочки mktrans
Поскольку вряд ли вы захотите набрать эту команду несколько раз, я
рекомендуем обернуть его в скрипт. Вы можете скачать оболочку BASH
скрипт от github который
выполняет мое предложенное решение. Он может быть запущен на нескольких файлах в
каталог и содержит полезные комментарии на случай, если вы хотите
подправить вещи.
bg_removal script
Кстати, ImageMagick на самом деле поставляется со скриптом под названием
"bg_removal"
который использует заливку таким же образом, как мое решение. Тем не менее
результаты не велики, потому что он все еще использует 1-битную альфа. Так же
Скрипт bg_removal работает медленнее и его немного сложнее использовать (он
требует, чтобы вы указали два разных значения fuzz). Вот пример вывода из bg_removal.