Заменить прозрачность в изображениях PNG на белый фон


294

У меня есть несколько PNG-изображений с прозрачностью, и мне нужно создать версии со слоем изображения, составленным на белом фоне. Я пробовал разные вещи с операциями преобразования изображений Image Magick, но либо ничего не происходит, либо я получаю ошибку. Я не хочу переходить на промежуточную форму JPG, потому что я не хочу артефактов. Конечно, это легко сделать в Gimp, Photoshop или где-то еще, но я бы предпочел написать это из командной строки, потому что таких вещей много.

Пример нерабочей команды Image Magick:

convert img1.png -background white -flatten img1-white.png

Это приводит к ошибке.

Спасибо!


В моем конкретном случае слой прозрачности в PNG конфликтовал при прохождении через процессор (Apache) FO для создания PDF / A. PDF / A не позволяет прозрачность. Взлом, который я использовал, - вместо этого обратиться к JPG.
Вивани

3
«Это приводит к ошибке». Что такое сообщение об ошибке?
Аарон МакДейд

Эта команда должна работать нормально. Если это не так, то у вас может быть глючная установка Imagemagick или libpng или ваши версии слишком старые. Какая у вас версия Imagemagick и libpng?
fmw42

Ответы:


255

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

convert -flatten img1.png img1-white.png

Ссылки на документацию:


3
Каким-то образом это не работает для меня ... Я попробовал "-прозрачный белый цвет", но получил исключение / предупреждение.
Уильям Ниу

1
Оказывается, мне нужно также установить -background на белый. Я также должен был загрузить colors.xml, который отсутствовал.
Уильям Ниу

9
Проверьте мой ответ ниже. Он был добавлен через 2 года после этого.
Рок Краль

42
НЕ пытайтесь конвертировать многостраничные документы с -flatten. Это сгладит страницы в одну страницу.
Тим С.

8
Если вы хотите сделать это для всех файлов из вашей папки, вы можете сделать это следующим образом: на mogrify -flatten *.pngвсякий случай не забудьте сделать резервную копию. Более подробная информация здесь: imagemagick.org/script/mogrify.php
troyane

372
-background white -alpha remove -alpha off

Пример:

convert image.png -background white -alpha remove -alpha off white.png

Не стесняйтесь заменить whiteна любой другой цвет, который вы хотите. Документация Imagemagick говорит об этой -alpha removeоперации:

Эта операция проста и быстра, и выполняет работу без необходимости использования дополнительной памяти или других побочных эффектов, которые могут быть связаны с альтернативными методами удаления прозрачности. Таким образом, это предпочтительный способ удаления прозрачности изображения.


3
Кажется, что -background whiteэто не нужно (хотя, вероятно, для других цветов).
Skippy le Grand Gourou

5
@SkippyleGrandGourou: это необходимо, поскольку запасной цвет прозрачности для PNG не всегда белый.
Рок Краль

3
лучше, чем принятый ответ (который в случае более чем одного слоя не делает правильную вещь)
axkibe

5
Полученное изображение все равно будет иметь альфа-канал. Это будет пусто, но все еще будет там. Чтобы полностью удалить канал доп -alpha off.
Иос

2
Не работает Я сделал новый PNG с прозрачным фоном и красной точкой посередине. Всегда производил черный фон, независимо от того, какой цвет я указывал. convert image.png -background white -alpha off white.pngпроизвел изображение с черным фоном. convert image.png -background "#00ff33" -alpha off 00ff33.pngпроизвел черный фон
McNulty

46

Свести изображение и применить фоновое изображение прямо в ImageMagick

Тем не менее, порядок команд очень важен

Чтобы применить любой фон к прозрачному изображению и сгладить его, сначала примените фон, а затем сгладьте его. Обратное не работает.

$ convert sourceimage.png -background BackgroundColor -flatten destinationimage.png

По какой-то причине, это работало хорошо для меня. Не уверен, почему ваша первоначальная попытка не сработала.
Энтони

23

Единственный, который работал для меня, был смесью всех ответов:

convert in.png -background white -alpha remove -flatten -alpha off out.png

4
Круто, это сработало. Мне действительно нужен был другой цвет, чем белый, и вы можете использовать ... -background "#010203" ...вместо белого.
Алексис Вилке

вот как заменить одно и то же изображение во всех папках в каталогеmogrify -background white -flatten */*.png
Julian

-alpha removeбыло то, что сделал это для меня
Стефан Драгнев

13

Вот как заменить одно и то же изображение во всех папках в каталоге белым вместо прозрачного:

mogrify -background white -flatten */*.png


10

Использование -flatten привело меня в бешенство, потому что -flatten в сочетании с влажным урожаем и изменением размеров просто не работает. Официальный и для меня единственный правильный способ - это «убрать» альфа-канал.

-альфа удалить -альфа выкл (не требуется с JPG)

Смотрите документацию: http://www.imagemagick.org/Usage/masking/#remove


так как бы стать командой? это не сработало здесь:convert imgWithTranspBkg.png -alpha remove -alpha off bkg.jpg resultImg.png
Водолей Сила

Я только хотел удалить альфу. Конвертировать в JPG сделал это, красиво и легко. Спасибо за чаевые.
Роджер К.С. Вернерссон,

Это единственное решение из вышеперечисленного, которое сработало для меня. Теперь магазин iTunes доволен моим изображением.
Билл Чесвик

7

Альфа Удалить раздел ImageMagick Использование Руководство предполагает , используя -alpha removeопцию, например:

convert in.png  -background white  -alpha remove  out.png

... используя -backgroundцвет по вашему выбору.

Руководство гласит:

Эта операция проста и быстра, и выполняет работу без необходимости использования дополнительной памяти или других побочных эффектов, которые могут быть связаны с альтернативными методами удаления прозрачности. Таким образом, это предпочтительный способ удаления прозрачности изображения.

Это дополнительно добавляет примечание:

Обратите внимание, что пока прозрачность «удалена», альфа-канал останется включенным, но теперь он будет полностью непрозрачным. Если вам больше не нужен альфа-канал, вы можете отключить его с помощью Alpha Off.

Таким образом, если вам не нужен альфа-канал, вы можете уменьшить размер выходного изображения, добавив -alpha offпараметр, например:

convert in.png  -background white  -alpha remove  -alpha off  out.png

Есть и другие подробности о других, часто используемых методах удаления прозрачности, описанных в разделе Удаление прозрачности из изображений .

В этот раздел включено упоминание важного предостережения относительно использования -flattenв качестве метода удаления прозрачности:

Однако это не будет работать с «mogrify» или с последовательностью нескольких изображений, в основном потому, что оператор «-flatten» действительно предназначен для объединения нескольких изображений в одно изображение.

Таким образом, если вы конвертируете несколько изображений одновременно, например, генерируете миниатюры из файла PDF, -flattenвы не будете делать то, что вам нужно (это сведет все изображения для всех страниц в одно изображение). С другой стороны, использование этой -alpha removeтехники все равно приведет к созданию нескольких изображений, каждое из которых будет удалено из прозрачности.


5

Похоже, что ваша команда верна, поэтому проблема может быть в отсутствии поддержки PNG (). Вы можете проверить convert -list configureили просто попробовать следующее:

sudo yum install libpng libpng-devel

1
Да, спасибо; эта (старая) проблема была ошибкой в ​​"графике магии", которая является разветвлением / переписыванием / чем-либо "имиджевой магии"
Pointy

@ Понятно, я вижу! Из любопытства, что было фактической причиной проблемы (это было только в одной версии)?
Аластер

Ну, я действительно не знаю точно; это была просто ошибка. Я не поддерживаю Graphicks Magick, поэтому у меня нет понимания их кода. Мне нужно попробовать еще раз в какой-то момент, я думаю.
Заостренный

в Ubuntu его нет? вот libpng12-0, но все еще не работает :(
Водолей Power

Я использую Ubuntu 13.04 с libpng12-0установленным и работающим. Можете ли вы увидеть png, если вы запустите это? convert -list configure | grep \png
Аластер

5

Это не совсем ответ на ваш вопрос, но я нашел ваш вопрос, пытаясь выяснить, как удалить альфа-канал, поэтому я решил добавить этот ответ здесь:

Если вы хотите удалить альфа-канал с помощью imagemagick, вы можете использовать эту команду:

mogrify -alpha off ./*.png

3

Похоже, мое решение установить «графическую магию» поверх «графической магии» имеет некоторые неровности - когда я переустанавливаю подлинную старую «графическую магию», тогда приведенная выше команда работает отлично.

редактирование , долгое время спустя - на днях я проверю, исправила ли эта проблема "графика магии".


2

Мне нужно было либо: -alpha backgroundи -flatten, или, или -fill.

Я сделал новый PNG с прозрачным фоном и красной точкой посередине.

convert image.png -background green -alpha off green.png не удалось: получилось изображение с черным фоном

convert image.png -background green -alpha background -flatten green.png произвел изображение с правильным зеленым фоном.

Конечно, с другим файлом, который я переименовал image.png, он ничего не смог сделать. Для этого файла я обнаружил, что цвет прозрачных пикселей был "# d5d5d5", поэтому я залил этот цвет зеленым:

convert image.png -fill green -opaque "#d5d5d5" green.png заменил прозрачные пиксели на правильный зеленый.


правильная команда с текущим ImageMagick будет convert image.png -background green -alpha background -alpha off green.pngили convert image.png -background green -alpha background -alpha remove green.pngили convert image.png -background green -flatten green.png
fmw42

1

Параметр без командной строки: откройте файл PNG в Windows Paint и нажмите «Сохранить».


0

это создает изображение, просто помещая 1-й с прозрачностью поверх 2-го

composite -gravity center ImgWithTransp.png BackgroundSameSizeOfImg.png ResultImg.png

изначально нашла подсказку на этот пост


0

Чтобы фактически удалить альфа-канал из файла, используйте опцию альфа-отключения :

convert in.png -background white -alpha off out.png

1
На самом деле ссылка, которую вы указали, гласит: «Она не удаляет и не уничтожает альфа-канал, прикрепленный к изображению, а просто отключает любой эффект, который этот канал оказывает на изображение». Чтобы действительно удалить альфа-канал, смотрите мой ответ.
Рок Краль

0

Я видел этот вопрос и ответы, которые действительно помогают мне, но тогда мне нужно было сделать это для большого количества файлов, поэтому, если у вас есть несколько изображений (PNG-изображений) в одной папке, и вы хотите сделать это для всех:

find ./ -name "*.png" -exec convert {} -flatten {} \;

-1

Альфа отключена, НЕ альфа удаляется! Загрузка из магазина приложений iOS не удалась, если на любом значке есть альфа-канал !!

Вот как это сделать: mogrify -alpha off * .png

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.