Usando o GraphicsMagick ou o ImageMagick, como substituo a transparência por uma cor de preenchimento?

5

Usando o GraphicsMagick, é bastante fácil substituir uma cor pela transparência ...

gm convert -transparent magenta src.png dst.png

Infelizmente, não consigo descobrir uma maneira simples de fazer exatamente o oposto. Se eu tenho um arquivo de imagem com transparência de canal alfa, como eu o componho em um fundo de cor constante e descarte o canal alfa agora redundante? A cor do plano de fundo deve afetar os pixels que eram parcialmente transparentes e totalmente transparentes.

Eu localizei a opção + matte, mas ela literalmente descarta a camada alfa - normalmente deixando pixels de cores indesejadas onde a transparência estava, em vez de, por exemplo, usando a opção -background para especificar uma cor de fundo a ser usada.

A única maneira de gerenciar isso até agora é usar várias chamadas - uma para gerar um arquivo de imagem de retângulo de cor sólida, outra para compor a imagem original com a imagem de cor sólida e uma terceira para descartar o canal alfa . Isso parece loucura - certamente deveria ser possível com uma única chamada bem simples?

Atualmente, uso o GraphicsMagick, mas não há compromisso - mudarei para o ImageMagick se isso facilitar as coisas.

EDITAR

Quando eu digo "A cor do plano de fundo deve afetar os pixels que eram parcialmente transparentes e totalmente transparentes", quero dizer, o resultado deve ser visivelmente o que eu esperaria de um blite transparente em um fundo de cor sólida. Os pixels parcialmente transparentes devem ser misturados.

Isso significa que, se eu invertesse o processo - transformando a chave da cor de fundo em transparência -, esperaria ver um halo ao redor da imagem original, onde a cor de fundo é mesclada aos pixels, de modo que a cor não corresponde e, portanto, não é convertido novamente em transparência. Não é o que a maioria das pessoas desejaria por esse motivo. É o que eu quero, no entanto, já que não vou converter o plano de fundo de volta para a transparência - ainda terei a imagem original com a transparência original se eu precisar dela.

    
por Steve314 21.11.2010 / 06:59

3 respostas

6

Usando GraphicsMagick, -background color -extent 0x0 deve ser capaz de substituir as duas primeiras etapas do processo (para o ImageMagick, seria -mosaic em vez de -extent ). Não tenho certeza sobre o terceiro passo, mas parece que você está rodando +matte na imagem dos dois primeiros passos, então a chamada final seria algo assim:

gm convert -background color -extent 0x0 +matte src.png dst.png

ou para o ImageMagick,

convert src.png -background color -mosaic +matte dst.png
    
por 23.11.2010 / 04:34
1

O que você está procurando quase se encaixa na descrição de -opaque, mas com uma torção. Assumindo um fundo de cor constante, o comando abaixo pode funcionar para você (eu só tenho o ImageMagick para testar).

gm convert -channel matte -threshold 0% -channel RGB -fill [your background color] -opaque transparent -channel matte -threshold 100% src.png dst.png

-channel matte -threshold 0% define pixels com qualquer transparência como totalmente transparente, -channel RGB -fill [your background color] -opaque transparent substitui pixels totalmente transparentes pela cor de preenchimento fornecida e -channel matte -threshold 100% remove a transparência de todos os pixels.

    
por 21.11.2010 / 09:18
1

Parece-me que você quer apenas compor a imagem transparente (ou parcial) sobre o fundo, com a mistura alfa. Esta página sugere que o código:

composite smile.gif rose: rose-over.png

é a base. Nos exemplos dados, ele mescla uma imagem sobre outra.

Agora, se quiser mesclar uma imagem com transparência sobre uma cor sólida de plano de fundo, você pode ter uma segunda imagem com o plano de fundo (se ela estiver estática) ou criar uma imagem básica com uma única cor / cheia mesmas dimensões em tempo de execução. Como você faria isso depende se você estiver usando o shell ou algum tipo de script (Perl, PHP, etc).

    
por 23.11.2010 / 05:10