Substituir transparência em imagens PNG por fundo branco

294

Tenho algumas imagens PNG com transparência e preciso criar versões com a camada de imagem composta em um fundo branco. Eu tentei várias coisas com as operações de "conversão" do Image Magick, mas nada acontece ou ocorre um erro. Eu não quero ir para um formulário JPG intermediário porque não quero os artefatos. Claro que é fácil fazer isso no Gimp ou no Photoshop ou o que quer que seja, mas eu prefiro escrever na linha de comando, porque existem muitas dessas coisas.

Um exemplo de um comando Image Magick que não funciona é:

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

Isso resulta em um erro.

Obrigado!

Pontudo
fonte
No meu caso específico, a camada de transparência em PNG entrou em conflito ao passar por um processador FO (Apache) para criar um PDF / A. PDF / A não permite transparência. O truque que usei é usar o JPG.
Wivani
3
"Isso resulta em um erro." Qual é a mensagem de erro?
Aaron McDaid
Esse comando deve funcionar bem. Caso contrário, você pode ter uma instalação com erros do Imagemagick ou libpng ou suas versões são muito antigas. Qual é a sua versão do Imagemagick e da libpng?
precisa saber é

Respostas:

255

Isso funciona para mim:

convert -flatten img1.png img1-white.png

Referências da documentação:

remosu
fonte
3
De alguma forma, isso não funciona para mim ... Tentei "branco transparente-cor", mas recebi uma exceção / aviso.
William Niu
1
Acontece que eu preciso definir o plano de fundo para branco também. Eu também tive que baixar o colors.xml, que estava faltando.
William Niu
9
Confira minha resposta abaixo. Foi adicionado 2 anos após este.
Ano Kralj
42
NÃO tente converter documentos com várias páginas -flatten. Ele achatará as páginas em uma página.
Tim S.
8
Se você deseja fazer isso em todos os arquivos da sua pasta, pode fazê-lo desta maneira: mogrify -flatten *.pngpor precaução, não se esqueça de fazer backup. Mais informações aqui: imagemagick.org/script/mogrify.php
troyane
372
-background white -alpha remove -alpha off

Exemplo:

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

Sinta-se livre para substituir whitepor qualquer outra cor que desejar. A documentação do Imagemagick diz isso sobre a -alpha removeoperação:

Essa operação é simples e rápida e faz o trabalho sem a necessidade de uso extra de memória ou outros efeitos colaterais que podem estar associados a técnicas alternativas de remoção de transparência. É, portanto, a maneira preferida de remover a transparência da imagem.

Rok Kralj
fonte
3
Parece que -background whitenão é necessário (provavelmente é para outras cores).
Skippy le Grand Gourou
5
@ SkippyleGrandGourou: é necessário, pois a cor de transparência da PNG nem sempre é branca.
Rok Kralj
3
melhor do que a resposta aceite (o que no caso de mais de uma camada não fazer a coisa certa)
axkibe
5
A imagem resultante ainda terá um canal alfa. Estará vazio, mas ainda estará lá. Para remover completamente o canal, adicione -alpha off.
Josch
2
Não funciona Criei um novo PNG com fundo transparente e um ponto vermelho no meio. Sempre produzia um fundo preto, independentemente da cor especificada. convert image.png -background white -alpha off white.pngproduziu uma imagem com fundo preto. convert image.png -background "#00ff33" -alpha off 00ff33.pngproduziu um fundo preto
McNulty
46

Achatar a imagem e aplicar a imagem de fundo é simples no ImageMagick

No entanto, a ordem dos comandos é muito importante

Para aplicar qualquer plano de fundo em uma imagem transparente e nivelá-la, primeiro aplique o plano de fundo e depois aplaná-la. O contrário não funciona.

$ convert sourceimage.png -background BackgroundColor -flatten destinationimage.png
acpmasquerade
fonte
Por qualquer motivo, isso funcionou bem para mim. Não sei por que sua tentativa original não funcionou.
Anthony
23

O único que funcionou para mim foi uma mistura de todas as respostas:

convert in.png -background white -alpha remove -flatten -alpha off out.png
db0
fonte
4
Legal, isso funcionou. Na verdade, eu precisava de outra cor que não o branco e você pode usar em ... -background "#010203" ...vez de usar o branco.
Alexis Wilke
aqui está como substituir a mesma imagem em todas as pastas em um diretóriomogrify -background white -flatten */*.png
Julian
-alpha removeFoi o que fez por mim
Stefan Dragnev
13

veja como substituir a mesma imagem em todas as pastas em um diretório por branco em vez de transparente:

mogrify -background white -flatten */*.png

Julian
fonte
10

O uso de -flatten me deixou completamente louco, porque -flatten em combinação com mogrify crop e redimensionamento simplesmente não funcionam. O oficial e para mim a única maneira correta é "remover" o canal alfa.

-alpha remove -alpha off (não é necessário com JPG)

Veja a documentação: http://www.imagemagick.org/Usage/masking/#remove

Tjarko Rikkerink
fonte
então como se tornaria o comando? isso não funcionou aqui:convert imgWithTranspBkg.png -alpha remove -alpha off bkg.jpg resultImg.png
Poder de Aquário
Eu só queria remover alfa. Converter em JPG fez isso, agradável e fácil. Obrigado pela dica.
Roger CS Wernersson
Esta é a única solução acima que funcionou para mim. Agora a loja do iTunes está feliz com a minha imagem.
Bill Cheswick
7

A seção Remover alfa do Guia de uso do ImageMagick sugere usar a -alpha removeopção, por exemplo:

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

... usando a -backgroundcor de sua escolha.

O guia declara:

Essa operação é simples e rápida e faz o trabalho sem a necessidade de uso extra de memória ou outros efeitos colaterais que podem estar associados a técnicas alternativas de remoção de transparência. É, portanto, a maneira preferida de remover a transparência da imagem.

Além disso, adiciona a nota:

Observe que, enquanto a transparência é 'removida', o canal alfa permanece ativado, mas agora fica totalmente opaco. Se você não precisar mais do canal alfa, poderá usar o Alpha Off para desativá-lo.

Portanto, se você não precisar do canal alfa, poderá diminuir o tamanho da imagem de saída adicionando a -alpha offopção, por exemplo:

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

Há mais detalhes sobre outras técnicas frequentemente usadas para remover a transparência descritas na seção Removendo a transparência das imagens .

Nesta seção, há uma menção importante a ser usada -flattencomo técnica para remover a transparência:

No entanto, isso não funcionará com "mogrify" ou com uma sequência de várias imagens, basicamente porque o operador "-flatten" foi realmente projetado para mesclar várias imagens em uma única imagem.

Portanto, se você estiver convertendo várias imagens de uma só vez, por exemplo, gerando miniaturas a partir de um arquivo PDF, -flattennão fará o que deseja (ele achatará todas as imagens de todas as páginas em uma imagem). Por outro lado, o uso da -alpha removetécnica ainda produzirá várias imagens, cada uma com a transparência removida.

Gary
fonte
5

Parece que seu comando está correto, portanto, o problema pode estar relacionado à falta de suporte para PNG (). Você pode verificar convert -list configureou apenas tentar o seguinte:

sudo yum install libpng libpng-devel
Alastair
fonte
1
Sim obrigado; este (old) questão era um bug no "graphicks Magick", que é um fork / reescrita / whatever de "Imagemagick'.
Pointy
@ Pointy eu vejo! Por curiosidade, qual foi a causa real do problema (que estava apenas em uma versão)?
Alastair
Bem, eu realmente não sei exatamente; foi apenas um bug. Não sou mantenedor da Graphicks Magick, portanto não tenho uma ideia do código deles. Eu preciso tentar novamente em algum momento, eu acho.
Pointy
o ubuntu não possui? Aqui está libpng12-0, mas ainda não funciona :(
Aquarius Power
Estou usando o Ubuntu 13.04 com libpng12-0instalado e funcionando. Você pode ver png se você executar isso? convert -list configure | grep \png
Alastair
5

Esta não é exatamente a resposta para sua pergunta, mas eu a encontrei enquanto tentava descobrir como remover o canal alfa, então decidi adicionar esta resposta aqui:

Se você deseja remover o canal alfa usando o imagemagick, pode usar este comando:

mogrify -alpha off ./*.png
FreeNickname
fonte
3

Bem, parece que minha decisão de instalar "graphics magick" sobre "image magick" tem algumas arestas - quando eu reinstalo a "image magick" genuína e antiga, o comando acima funciona perfeitamente.

editar , muito tempo depois - um dia desses vou verificar se "gráficos mágicos" corrigiu esse problema.

Pontudo
fonte
2

Eu precisava de: ambos -alpha backgrounde -flatten, ou -fill.

Criei um novo PNG com fundo transparente e um ponto vermelho no meio.

convert image.png -background green -alpha off green.png falhou: produziu uma imagem com fundo preto

convert image.png -background green -alpha background -flatten green.png produziu uma imagem com o fundo verde correto.

Obviamente, com outro arquivo que eu renomeei image.png, ele não conseguiu fazer nada. Para esse arquivo, descobri que a cor dos pixels transparentes era "# d5d5d5", então preenchi essa cor com verde:

convert image.png -fill green -opaque "#d5d5d5" green.png substituiu os pixels transparentes pelo verde correto.

McNulty
fonte
o comando apropriado com o ImageMagick atual seria convert image.png -background green -alpha background -alpha off green.pngou convert image.png -background green -alpha background -alpha remove green.pngou convert image.png -background green -flatten green.png
fmw42
1

Opção sem linha de comando: abra o arquivo PNG no Windows Paint e clique em Salvar.

hbere
fonte
0

isso cria uma imagem apenas colocando o primeiro com transparência no topo do segundo

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

originalmente encontrou a dica neste post

Aquarius Power
fonte
0

Para remover o canal alfa do arquivo, use a opção alpha off :

convert in.png -background white -alpha off out.png
Nick Dowell
fonte
1
Na verdade, o link que você forneceu diz: "Na verdade, ele não exclui ou destrói o canal alfa anexado à imagem, apenas desativa qualquer efeito que o canal tenha na imagem". Para realmente remover o canal alfa, veja minha resposta.
Rok Kralj
0

Eu vi essa pergunta e respostas que realmente me ajudaram, mas era necessário fazê-lo para muitos arquivos. Portanto, caso você tenha várias imagens (imagens PNG) em uma pasta e queira fazer tudo:

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

É -alpha off, NÃO -alpha remove! O upload da loja de aplicativos para iOS falha quando há um canal alfa em qualquer ícone!

Aqui está como fazer isso: mogrify -alpha off * .png

railsfanatic
fonte