Converter imagem em escala de cinza em imagem de canal alfa no shell unix

14

Eu tenho uma imagem em escala de cinza. Eu quero convertê-lo em um PNG transparente, de modo que os pixels pretos (na imagem original) fiquem totalmente opacos, os pixels brancos se tornem totalmente transparentes, um pixel de 50% cinza se torne 50% transparente e assim por diante para todos os tons entre.

Como posso conseguir isso?

(Sim, eu sei que isso é quase a mesma pergunta que Converter tons de escala de cinza em canal alfa , mas eu quero saber como fazer isso usando apenas ferramentas de linha de comando - por exemplo, ImageMagick ou NetPBM.

Aqui está um resultado de amostra da questão acima mencionada. Esta amostra é um resultado que eu gostaria de obter usando apenas ferramentas de linha de comando.

Se você abrir este PNG em um visualizador que ofereça suporte à transparência, verá o que quero dizer.

    
por zrajm 27.12.2012 / 15:26

2 respostas

17

Ooookay. Depois de muito googling, e lendo mais do manual do ImageMagick do que eu realmente gosto, aqui está a resposta. Como você tem uma imagem em tons de cinza chamada source.png , aqui estão meus comandos.

Para tornar os pixels pretos transparentes e manter os pixels brancos como estão, execute este comando:

 convert source.png -alpha copy -fx '#fff' result.png

Para tornar os pixels brancos transparentes enquanto mantém o preto como está, use:

 convert source.png -alpha copy -channel alpha -negate +channel -fx '#000' result.png

Vamos explicar esse último comando com mais detalhes:

  • convert - É o comando ImageMagic (um dos vários)
  • source.png - A imagem de origem em escala de cinzentos.
  • -alpha copy - Copie o conteúdo do arquivo anterior para o canal alfa.
  • -channel alpha - especifica que os seguintes operadores só devem afetar o canal alfa.
  • -negate - Inverta o canal alfa (porque o -chanel alpha anterior não afeta nenhuma outra parte da imagem).
  • +channel - Especifique que os operadores a seguir devem apenas afetar os canais de cores e não modificar mais o canal alfa. (Esse é o padrão e, portanto, não precisamos fornecê-lo no primeiro exemplo mais simples).
  • -fx '#000' - Substitui o conteúdo do canal de cor por pixels pretos. (Por causa de +channel , o canal alfa não será afetado).

É muito importante incluir essa opção final -fx , caso contrário, todos os pixels semitransparentes na imagem gerada manterão as cores. (Como esses pixels são meio transparentes, pode não ser óbvio, mas o resultado final não é o que se espera.)

Achei bastante útil a lista de opções do ImageMagick .

    
por 28.12.2012 / 00:38
0

Com o ImageMagick 7.0, a resposta acima não funciona mais. Mas você pode usar:

convert source.png -canal rgb -fx '#fff' result.png

Aka, preencha os canais RGB com espaço em branco e deixe o alfa como antes.

    
por 27.03.2018 / 17:39