Встановіть прозорий фон за допомогою ImageMagick та командного рядка


120

Припустимо, у вас є зображення (PNG або JPG). Це зображення має білий фон, і мені потрібно зробити цей фон прозорим.

Я спробував з такими прикладами:

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

але без бажаних результатів.

Як я можу це зробити?

ВАЖЛИВО: Використання convertкомандного рядка.


Незвичайно - я думав, що відповідна команда була, convert original.png -transparent white new.pngале, спробувавши її, не можу змусити її працювати. На відміну, ви впевнені, що ваш фон насправді білий (#FFFFFF) або він майже білий (наприклад, #FEFEFE)?
mathematical.coffee

@ mateatic.coffee Ок, я розумію, дозвольте мені перевірити, чи це не так, і я продовжуватиму цю тему. Дякую.
Ізраїль

@ matematic.coffee Привіт ще раз, я перевірив кольори, і на цьому зображенні є фон, як #FFFFFF, іншими словами "білий". :( Це не так!
Ізраїль

Відповіді:


140

Я використовую ImageMagick 6.6.9-7 на Ubuntu 12.04.
Для мене працювало таке:

convert test.png -transparent white transparent.png

Це змінило все біле в test.png на прозоре.


6
Це не спрацювало для мене, поки я не зрозумів, що JPG не зробить прозорим. Як тільки я перейшов на PNG, він зробив саме те, що хотів - просто довелося змінити "білий" на "rgb ($ r, $ g, $ b)".
Роджер Дуек

2
Трясця! це чудово!
агілоб

2
Це дозволить не тільки перетворити фон в прозорий, але і кожен білий піксель. Чи є спосіб перетворити фон лише у прозорий?
Алехандро Лозджійський

2
@AlejandroLozdziejski - як ти визначаєш "тло"?
Жуль

1
@AlejandroLozdziejski: Добре питання. Будь ласка, дивіться моє рішення, яке використовує заливку з країв, шукаючи кольори, приблизно такі ж, як у верхньому лівому пікселі.
hackerb9

79

У мене була така ж проблема. У якому мені потрібно видалити білий фон із формату зображення jpg / png за допомогою ImageMagick.

Що для мене працювало:

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

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


6
Це добре, щоб вийшов більш плавний край між прозорим фоном та непрозорим переднім планом. Якщо ви перетворюєте шумні піктограми в JPG в PNG і хочете додати прозорість, ви також можете додати деяку серединну фільтрацію:mogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg
Tomasz Gandor

44

Рішення

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.

Сценарій bg_removal: має бороду, але їй не вистачає антиалійного


2
Мені потрібно було змінити нечіткість до 2%, оскільки зображення містить білу машинку з білим тлом. І хоча це не на 100% ідеально, це найкраще рішення, яке я знайшов, оскільки я не хочу це робити вручну gimpчи що завгодно. :)
tukusejssirs

1
Дивовижне рішення!
0x01h

29

Це працює для мене:

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

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


1
Оце Так! Це саме те, що мені було потрібно! до: i.imgur.com/2Rd7w1N.png , після: i.imgur.com/4RTYygo.png
Доріан

Це не працює ідеально, оскільки не вдається обробляти зображення з білим кольором та білим тлом. як козирні фотографії.
старший

Для білого на білому спробуйте використовувати розчин для заливки, який я розмістив вище . Або скористайтеся моїм mktransсценарієм оболонки: github.com/hackerb9/mktrans
hackerb9

12

Ви можете використовувати це, щоб зробити фон прозорим

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

Сказане дає префекту прозорий фон


4
Оболонка може зажадати певного цитування (): convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
Джим К.

7

Використовуючи ImageMagick, це дуже схоже на код і результат hackerb9, але це трохи простіший командний рядок. Це передбачає, що верхній лівий піксель - це колір тла. Я просто заливаю фон прозорістю, потім вибираю альфа-канал і розмиваю його і видаляю половину розмитої області, використовуючи -рівень 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

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


Приємно. Мені подобається, що ти отримав суть цього в стислій лінії. Це схоже на один з моїх проміжних кроків, коли я писав сценарій. Я вирішив проти цього, оскільки (а) він втрачає занадто багато гострих деталей, (б) я хотів зробити вибір кольору очевидним, щоб його можна було легко змінити, і (в) я хотів залити з усіх країв, а не тільки з верху -лівий кут. (Можливо, є й інші речі, про які я зараз забуваю).
hackerb9

2
PS Я зроблю дику здогадку, що "fmw" означає Фред М. Вайнгауз. Якщо так, привітання, доктор Вайнгауз! Кожному, хто не знає, хто він, він написав кілька дослідницьких досліджень з комп'ютерної графіки, починаючи з 1970-х. Кожен повинен перевірити його дивовижну конукопію скриптів оболонок ImageMagick на веб- сайті fmwconcepts.com/imagemagick .
hackerb9

1
@ hackerb9: Так, це я. Ми знайомі? Надішліть мені електронний лист, якщо хочете. Моя адреса електронної пошти знаходиться на моїй веб-сторінці, яку ви пов’язали.
fmw42

4

Якщо ви хочете контролювати рівень прозорості, ви можете використовувати 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

Так. Була і ця ж проблема. Ось команда, яку я виконав, і вона спрацювала чудово: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.