Convierta la imagen en escala de grises en una imagen de canal alfa en unix shell

14

Tengo una imagen en escala de grises. Quiero convertirlo en un PNG transparente, de modo que los píxeles negros (en la imagen original) se vuelvan completamente opacos, los píxeles blancos se vuelvan completamente transparentes, un píxel gris al 50% se volverá 50% transparente, y así sucesivamente para todas las sombras entre.

¿Cómo puedo conseguir esto?

(Sí, sé que esta es casi la misma pregunta que Convertir sombras de escala de grises en canal alfa , pero quiero saber cómo hacerlo usando solo herramientas de línea de comandos , por ejemplo, ImageMagick o NetPBM).

Aquí hay un ejemplo de resultado de la pregunta mencionada anteriormente. Este ejemplo es un resultado que me gustaría lograr usando solo herramientas de línea de comandos.

Muestra

Si abre este PNG en un visor que admite transparencia, verá lo que quiero decir.

zrajm
fuente

Respuestas:

18

Ooookay Después de mucho buscar en Google y leer más del manual de ImageMagick de lo que realmente me interesa, aquí está la respuesta. Dado que tiene una imagen en escala de grises llamada source.png, aquí están mis comandos.

Para hacer que los píxeles negros sean transparentes y mantener los píxeles blancos como están, ejecute este comando:

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

Para hacer que los píxeles blancos sean transparentes mientras se mantienen los negros tal como están, use:

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

Vamos a explicar ese último comando un poco más a fondo:

  • convert - Es el comando ImageMagic (uno de varios)
  • source.png - La imagen de origen en escala de grises.
  • -alpha copy - Copie el contenido del archivo anterior en el canal alfa.
  • -channel alpha - Especifique que los siguientes operadores solo deberían afectar el canal alfa.
  • -negate- Invierta el canal alfa (debido a lo anterior -chanel alphano afectará ninguna otra parte de la imagen).
  • +channel- Especifique que los siguientes operadores solo deberían afectar los canales de color y no modificar el canal alfa. (Este es el valor predeterminado y, por lo tanto, no necesitamos proporcionarlo en el primer ejemplo, más simple).
  • -fx '#000'- Reemplace el contenido del canal de color con píxeles negros. (Debido +channelal canal alfa no se verá afectado).

Es bastante importante incluir esa -fxopción final , de lo contrario, todos los píxeles semitransparentes en la imagen generada conservarán los colores. (Dado que estos píxeles son semitransparentes, puede que no sea obvio, pero el resultado final no es lo que uno espera).

La lista de opciones de ImageMagick me pareció bastante útil.

zrajm
fuente
bastante buena explicación para lograr mi objetivo, cuando estoy usando un segundo comando que hace que mi imagen sea más oscura que la imagen real en escala de grises. En realidad, mi objetivo de lograr el mismo tono de color que existe en escala de grises que no sea esa transparencia es como se esperaba. alguna idea para lograr eso?
Hardik Patel
eso es muy útil, gracias! :) me alegro de no tener que resolverlo por mí mismo
Sam Watkins
¡¡¡¡¡¡Te quiero!!!!!!
mescarra
Probablemente sea mejor enviarme este tipo de comentarios a través de este canal: okcupid.com/profile/zrajm :)
zrajm
1
No estoy seguro de por qué, pero con la versión actual (ImageMagick 7.0.7-21) solo obtengo una imagen blanca / negra sólida como resultado, sin ningún canal alfa. Copié la línea de comandos al pie de la letra, cambiando solo las rutas de entrada / salida del archivo. Tal vez hicieron algunos cambios incompatibles con versiones anteriores.
Nombre para mostrar el
0

Con ImageMagick 7.0, la respuesta anterior ya no. Pero puedes usar:

convertir source.png -channel rgb -fx '#fff' result.png

También, rellena los canales RGB con blanco y deja que el alfa sea como antes.

tito
fuente
Sospecho que te perdiste la 'copia alfa' :)
Chris
0

Con imagemagick 7, creo que es necesario especificar -channel RGBantes -fx, de lo contrario, obtendrá una imagen negra sólida, como esta:

convert input.png -alpha copy -channel RGB -fx '#000' out.png

Y negar es útil si desea que el negro sea opaco y el blanco transparente:

convert input.png -negate -alpha copy -channel RGB -fx '#000' out.png
Chris
fuente