Установите прозрачный фон с помощью 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
@ Mathematical.coffee Хорошо, я понимаю, позвольте мне проверить, если это не так, и я продолжу эту тему. Спасибо.
Израиль
@ Mathematical.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
Проклятье! это круто!
agilob
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
Томаш Гандор
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% -transparent white») с моим решением при запуске на логотипе ImageMagick . Я выровнял оба прозрачных изображения на коричневом фоне, чтобы различия были очевидны (нажмите, чтобы увидеть оригиналы).

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

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

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

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

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

bg_removal скрипт

Кстати, ImageMagick на самом деле поставляется со скриптом под названием «bg_removal», который использует floodfill так же, как и мое решение. Однако результаты невысокие, потому что он по-прежнему использует 1-битный альфа-канал. Кроме того, сценарий bg_removal работает медленнее и немного сложнее в использовании (он требует, чтобы вы указали два разных значения нечеткости). Вот пример вывода bg_removal.

Скрипт bg_removal: есть борода, но отсутствует антиалиасинг

hackerb9
источник
2
Мне нужно было изменить пушистость до 2%, потому что изображение содержит белую машину с белым фоном. И хотя это не на 100% идеально, это лучшее решение, которое я нашел, поскольку я не хочу делать это вручную gimpили что-то еще. :)
tukusejssirs
1
Отличное решение!
0x01h 06
29

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

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

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

Ricibald
источник
1
Вот Это Да! Это именно то, что мне нужно! перед: i.imgur.com/2Rd7w1N.png , после: i.imgur.com/4RTYygo.png
Дориан
Он не работает идеально, потому что не может обрабатывать изображения с белым цветом и белым фоном. как фото козыря.
Старший руководитель группы программистов PHP
Для белого на белом попробуйте использовать раствор заливки, который я опубликовал выше . Или используйте мой 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 -level 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

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

fmw42
источник
Ницца. Мне нравится, что вы изложили суть в сжатой строке. Это похоже на один из моих промежуточных шагов, когда я писал сценарий. Я отказался от этого, потому что (а) он теряет слишком много резких деталей, (б) я хотел сделать выбор цвета очевидным, чтобы его можно было легко изменить, и (в) я хотел заливать заливкой со всех краев, а не только сверху -левый угол. (Возможно, я сейчас забыл о других вещах).
hackerb9
2
PS Я собираюсь сделать безумное предположение, что "fmw" означает Fred M. Weinhaus. Если да, то привет, доктор Вайнхаус! Для всех, кто не знает, кто он такой, он написал несколько плодотворных исследований в области компьютерной графики, начиная с 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

stacigh
источник