Ответ 1
Я использую ImageMagick 6.6.9-7 на Ubuntu 12.04.
Что для меня работало:
convert test.png -transparent white transparent.png
Это изменило все белые в test.png на прозрачные.
Предположим, что у вас есть изображение (PNG или JPG). Это изображение имеет белый фон, и мне нужно сделать этот фон прозрачным.
Я попытался с этими примерами:
convert original.png -background none transparent.png
convert original.png -background white -flatten -alpha off transparent.png
но без желаемых результатов.
Как я могу это сделать?
ВАЖНО: использование командной строки convert
.
Я использую ImageMagick 6.6.9-7 на Ubuntu 12.04.
Что для меня работало:
convert test.png -transparent white transparent.png
Это изменило все белые в test.png на прозрачные.
У меня была та же проблема. В котором мне нужно удалить белый фон из формата jpg/png с помощью ImageMagick.
Что для меня работало:
1) Преобразование формата изображения в png: convert input.jpg input.png
2) convert input.png -fuzz 2% -transparent white output.png
Это работает для меня:
convert original.png -fuzz 10% -transparent white transparent.png
где чем меньше fuzz%, тем ближе к истинному белому или наоборот, чем больше%, тем больше отклонение от белого становится прозрачным.
Вы можете использовать это, чтобы сделать фоновый прозрачный
convert test.png -background rgba(0,0,0,0) test1.png
Вышеприведенный дает прозрачный фон префекта
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-битным alpha так или иначе.)
Так как маловероятно, вам нужно будет повторно набирать эту команду, я рекомендуется обернуть его в script. Вы можете загрузить оболочку BASH script от github, который выполняет мое предложенное решение. Он может запускаться на нескольких файлах в и содержит полезные комментарии, если вы хотите настраивать вещи.
Кстати, ImageMagick на самом деле поставляется с script, называемым "bg_removal" который использует заливку так же, как и мое решение. Однако результаты невелики, потому что он все еще использует 1-битную альфу. Так же bg_removal script работает медленнее и немного сложнее использовать (он требует, чтобы вы указали два разных значения fuzz). Здесь приведен пример вывода из bg_removal.
Если вы хотите контролировать уровень прозрачности, вы можете использовать rgba. где a - альфа. 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
Используя ImageMagick, это очень похоже на код и результат hackerb9, но это немного упрощенная командная строка. Он предполагает, что верхний левый пиксель является цветом фона. Я просто заливаю фон прозрачностью, затем выбираю альфа-канал и размываю его и удаляю половину размытой области с использованием уровня 50х100%. Затем поверните назад все каналы и прижмите его к коричневому цвету. Уровень -blur 0x1-level 50x100% действует на антиалиасы границ прозрачности альфа-канала. Вы можете отрегулировать значение fuzz, значение размытия и значение уровня 50%, чтобы изменить степень сглаживания.
convert logo: -fuzz 25% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg
Угу. С этой же проблемой тоже. Вот команда, которую я запускал, и она отлично работала:
convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico