Установите прозрачный фон с помощью ImageMagick и командной строки

Допустим, у вас есть какое-нибудь изображение (PNG или JPG). У этого изображения белый фон, и мне нужно сделать его прозрачным.

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

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

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

Как я могу это сделать?

ВАЖНО: с помощью convert командной строки.


person Israel    schedule 06.02.2012    source источник
comment
Странно - я думал, что соответствующая команда была convert original.png -transparent white new.png, но, попробовав ее, не смог заставить ее работать. Кстати, вы уверены, что ваш фон на самом деле белый (#FFFFFF) или он просто почти белый (например, #FEFEFE)?   -  person mathematical.coffee    schedule 06.02.2012
comment
@ Mathematical.coffee Хорошо, я понимаю, позвольте мне проверить, если это не так, и я продолжу эту тему. Спасибо.   -  person Israel    schedule 06.02.2012
comment
@ Mathematical.coffee Еще раз привет, я проверил цвета, и это изображение имеет фон как #FFFFFF, то есть белый. :( Это не тот случай!   -  person Israel    schedule 06.02.2012


Ответы (8)


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

convert test.png -transparent white transparent.png

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

person Rijk    schedule 20.06.2012
comment
У меня это не сработало, пока я не понял, что JPG не будет прозрачным. Как только я переключился на PNG, он сделал именно то, что я хотел - просто нужно было изменить белый цвет на rgb ($ r, $ g, $ b). - person Roger Dueck; 10.02.2016
comment
Это превратит не только фон в прозрачный, но и каждый белый пиксель. Есть ли способ преобразовать фон только в прозрачный? - person Alejandro Lozdziejski; 21.10.2016
comment
@AlejandroLozdziejski - как вы определяете предысторию? - person Jules; 23.12.2016
comment
@AlejandroLozdziejski: Хороший вопрос. Пожалуйста, посмотрите мое решение, в котором используется заливка по краям, ища цвета примерно такие же, как у верхнего левого пикселя. - person hackerb9; 04.07.2017
comment
Для того же результата можно использовать шестнадцатеричные цветовые коды: convert test.png -transparent "#ffffff" transparent.png - person hbere; 13.02.2020

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

Для меня сработало:

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

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

person Sandeep Pal    schedule 10.05.2013
comment
Это хорошо, чтобы иметь более гладкую границу между прозрачным фоном и непрозрачным передним планом. Если вы конвертируете зашумленные значки из JPG в PNG и хотите добавить прозрачности, вы также можете добавить некоторую медианную фильтрацию: mogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg - person Tomasz Gandor; 23.10.2014

Решение

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", который использует заливку в аналогично моему решению. Однако результаты невысокие, потому что он по-прежнему использует 1-битный альфа-канал. Кроме того, скрипт bg_removal работает медленнее и немного сложнее в использовании (он требует, чтобы вы указали два разных значения нечеткости). Вот пример вывода bg_removal.

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

person hackerb9    schedule 14.06.2017
comment
Мне нужно было изменить пушистость до 2%, потому что изображение содержит белую машину с белым фоном. И хотя это не на 100% идеально, это лучшее решение, которое я нашел, поскольку я не хочу делать это вручную в gimp или в чем-то еще. :) - person tukusejssirs; 15.06.2019
comment
Замечательное решение! - person 0x01h; 06.12.2019
comment
Работал у меня. Большой! - person Eelco van Vliet; 21.08.2020
comment
Замечательное решение! действительно хорошо продуман и скомпонован. Спасибо OP - person Jishnu P Das; 25.01.2021

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

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

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

person Ricibald    schedule 01.07.2014
comment
Ух ты! Это именно то, что мне нужно! до: i.imgur.com/2Rd7w1N.png, после: i.imgur.com/4RTYygo.png - person Dorian; 26.01.2016
comment
Он не работает идеально, потому что не может обрабатывать изображения с белым цветом и белым фоном. как фото козыря. - person Senior PHP Developer; 27.11.2019
comment
Для белого на белом попробуйте использовать решение для заливки, которое я опубликовал выше. Или используйте мой mktrans сценарий оболочки: github.com/hackerb9/mktrans - person hackerb9; 07.12.2019

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

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

Вышеупомянутое дает префект прозрачный фон

person Sanat Kumar Panda    schedule 29.01.2014
comment
Оболочка может потребовать цитирования (): convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png - person Jim K.; 15.05.2016
comment
это лучше всего + обрабатывает случаи, когда исходное изображение может иметь белые области (или любой другой цвет, который вы используете в -transparent SOMECOLOR - person Jason S; 02.12.2020

Используя 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

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

person fmw42    schedule 14.06.2017
comment
Отлично. Мне нравится, что вы изложили суть в сжатой строке. Это похоже на один из моих промежуточных шагов, когда я писал сценарий. Я отказался от этого, потому что (а) он теряет слишком много резких деталей, (б) я хотел сделать выбор цвета очевидным, чтобы его можно было легко изменить, и (в) я хотел заливать заливкой со всех краев, а не только сверху -левый угол. (Возможно, я сейчас забыл о других вещах). - person hackerb9; 04.07.2017
comment
P.S. Я собираюсь сделать безумное предположение, что fmw означает Fred M. Weinhaus. Если так, то привет, доктор Вайнхаус! Для всех, кто не знает, кто он такой, он написал некоторые из основополагающих исследований в области компьютерной графики, начиная с 1970-х годов. Каждый должен ознакомиться с его удивительной коллекцией сценариев оболочки ImageMagick на fmwconcepts.com/imagemagick. - person hackerb9; 14.07.2017
comment
@ hackerb9: Да, это я. Мы знакомы? Отправьте мне электронное письмо, если хотите. Мой адрес электронной почты находится на моей веб-странице, на которую вы указали. - person fmw42; 21.08.2017

Если вы хотите контролировать уровень прозрачности, вы можете использовать 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
person Gokul N K    schedule 23.01.2015

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

person stacigh    schedule 14.10.2015