Рішення
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 скрипт
До речі, ImageMagick насправді постачається зі сценарієм під назвою
"bg_removal",
який використовує "заливку" аналогічно моєму рішенню. Однак результати не великі, оскільки він все ще використовує 1-бітну альфа. Крім того, сценарій bg_removal працює повільніше і трохи складніше використовувати (він вимагає вказати два різних значення нечіткості). Ось приклад виводу з bg_removal.
convert original.png -transparent white new.png
але, спробувавши її, не можу змусити її працювати. На відміну, ви впевнені, що ваш фон насправді білий (#FFFFFF) або він майже білий (наприклад, #FEFEFE)?