Заменить прозрачность в изображениях 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

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

remosu
источник
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
acpmasquerade
источник
По какой-то причине, это работало хорошо для меня. Не уверен, почему ваша первоначальная попытка не сработала.
Энтони
23

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

convert in.png -background white -alpha remove -flatten -alpha off out.png
DB0
источник
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техники все равно приведет к созданию нескольких изображений, каждое из которых будет удалено из прозрачности.

Gary
источник
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
FreeNickname
источник
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 и нажмите «Сохранить».

hbere
источник
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 {} \;
talsibony
источник
-1

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

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

railsfanatic
источник