png imagemagick alpha-transparency

png - Establecer fondo transparente utilizando ImageMagick y símbolo de línea de comando



alpha-transparency (8)

Solución

color=$( convert filename.png -format "%[pixel:p{0,0}]" info:- ) convert filename.png -alpha off -bordercolor $color -border 1 / /( +clone -fuzz 30% -fill none -floodfill +0+0 $color / -alpha extract -geometry 200% -blur 0x0.5 / -morphology erode square:1 -geometry 50% /) / -compose CopyOpacity -composite -shave 1 outputfilename.png

Explicación

Esto es bastante más largo que las respuestas simples dadas anteriormente, pero da resultados mucho mejores: (1) La calidad es superior debido a la alfa antialias, y (2) solo se elimina el fondo en lugar de un solo color. ("Fondo" se define como aproximadamente del mismo color que el píxel superior izquierdo, utilizando un relleno de los bordes de la imagen).

Además, el canal alfa también se erosiona en medio píxel para evitar halos. Por supuesto, las operaciones morfológicas de ImageMagick no funcionan (¿todavía?) En el nivel de subpixel, por lo que puedes ver que estoy explotando el canal alfa al 200% antes de erosionar.

Comparación de resultados

Aquí hay una comparación del enfoque simple ("-fuzz 2% -transparent blanco") versus mi solución, cuando se ejecuta en el logotipo de ImageMagick . He aplanado ambas imágenes transparentes sobre un fondo marrón de silla de montar para que aparezcan las diferencias (haga clic para ver los originales).

Observe cómo la barba del Mago ha desaparecido en el enfoque simple. Compara los bordes del Asistente para ver cómo el alfa antialias ayuda a la figura a mezclarse suavemente en el fondo.

Por supuesto, admito por completo que hay momentos en los que puede desear utilizar la solución más simple. (Por ejemplo: es muchísimo más fácil de recordar y si te estás convirtiendo a GIF, de todos modos estás limitado a alfa de 1 bit).

guión de shell mktrans

Dado que es poco probable que desee escribir este comando repetidamente, le recomiendo que lo ajuste en un script. Puede descargar un script de shell de BASH desde github que realiza mi solución sugerida. Se puede ejecutar en múltiples archivos en un directorio e incluye comentarios útiles en caso de que quiera ajustar las cosas.

script bg_removal

Por cierto, ImageMagick en realidad viene con un script llamado "bg_removal" que usa floodfill de manera similar a mi solución. Sin embargo, los resultados no son buenos porque aún usa alfa de 1 bit. Además, el script bg_removal se ejecuta más lento y es un poco más complicado de usar (requiere que especifique dos valores diferentes de fuzz). Aquí hay un ejemplo de la salida de bg_removal.

Supongamos que tiene alguna imagen (PNG o JPG). Esta imagen tiene un fondo blanco y necesito que este fondo sea transparente.

He intentado con estos ejemplos:

  • convert original.png -background none transparent.png
  • convert original.png -background white -flatten -alpha off transparent.png

pero sin resultados deseables

¿Cómo puedo hacerlo?

IMPORTANTE: Usar convert línea de comando.


Esto funciona para mí:

convert original.png -fuzz 10% -transparent white transparent.png

donde cuanto menor sea el fuzz%, más cercano al verdadero blanco o, a la inversa, cuanto mayor sea el%, mayor será la variación del blanco que se vuelva transparente


Estoy usando ImageMagick 6.6.9-7 en Ubuntu 12.04.
Lo que funcionó para mí fue lo siguiente:

convert test.png -transparent white transparent.png

Eso cambió todo el blanco en el test.png a transparente.


Puede usar esto para hacer que el fondo sea transparente

convert test.png -background rgba(0,0,0,0) test1.png

Lo anterior le da al prefecto fondo transparente


Sí. Tenía este mismo problema también. Aquí está el comando que ejecuté y funcionó perfectamente: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico


Si desea controlar el nivel de transparencia, puede usar rgba. donde a es el alfa. 0 para transparente y 1 para opaco. Asegúrese de que el archivo final de salida debe tener la extensión .png para la transparencia.

convert test.png -channel rgba -matte -fuzz 40% -fill "rgba(255,255,255,0.5)" -opaque "rgb(255,255,255)" semi_transparent.png


Usando ImageMagick, esto es muy similar al código y resultado hackerb9, pero es una línea de comando un poco más simple. Asume que el píxel superior izquierdo es el color de fondo. Simplemente inundo llene el fondo con transparencia, luego selecciono el canal alfa y lo desenfoque y elimino la mitad del área borrosa usando -level 50x100%. Luego, vuelve a encender todos los canales y aplástalo contra el color marrón. El -blur 0x1-level 50x100% actúa antialias de los límites de la transparencia del canal alfa. Puede ajustar el valor de fuzz, la cantidad de desenfoque y el nivel de 50% para cambiar el grado de antialiasing.

convert logo: -fuzz 25% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg


Yo tuve el mismo problema. En el cual tengo que eliminar el fondo blanco del formato de imagen jpg / png usando ImageMagick.

Lo que funcionó para mí fue:

1) Convertir formato de imagen a png: convert input.jpg input.png

2) convert input.png -fuzz 2% -transparent white output.png