Establecer fondo transparente usando ImageMagick y la línea de comandos


120

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

Lo he probado 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: usando convertla línea de comandos.


Extraño: pensé que el comando relevante era, convert original.png -transparent white new.pngpero al intentarlo, no puedo hacer que funcione. Aparte, ¿está seguro de que su fondo es realmente blanco (#FFFFFF), o es casi blanco (por ejemplo, #FEFEFE)?
mathematical.coffee

@ math.coffee Ok, lo entiendo, déjame comprobar si este no es el caso y continuaré este hilo. Gracias.
Israel

@ math.coffee Hola de nuevo, he comprobado los colores y esta imagen tiene un fondo como #FFFFFF, en otras palabras, "blanco". :( ¡Este no es el caso!
Israel

Respuestas:


140

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.


6
Esto no funcionó para mí hasta que me di cuenta de que JPG no es transparente. Una vez que cambié a PNG, hizo exactamente lo que quería: solo tuve que cambiar "blanco" a "rgb ($ r, $ g, $ b)".
Roger Dueck

2
¡Maldita sea! ¡esto es genial!
agilob

2
Esto no solo convertirá el fondo en transparente, sino todos los píxeles blancos. ¿Hay alguna forma de convertir el fondo solo en transparente?
Alejandro Lozdziejski

2
@AlejandroLozdziejski - ¿cómo estás definiendo "antecedentes"?
Jules

1
@AlejandroLozdziejski: Buena pregunta. Consulte mi solución que utiliza un relleno de inundación desde los bordes, buscando colores aproximadamente iguales a los del píxel superior izquierdo.
hackerb9

79

Yo tuve el mismo problema. En el que 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


6
Esto es bueno para tener un borde más suave entre el fondo transparente y el primer plano opaco. Si convierte íconos ruidosos en JPG a PNG y desea agregar transparencia, también puede agregar algunos filtros mogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg
medios

44

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 más bien un poco más que los simples respuestas dadas anteriormente, pero da mucho mejores resultados: (1) La calidad se debe superior a alfa suavizado, y (2) solamente 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 inundación desde los bordes de la imagen).

Además, el canal alfa también se erosiona medio píxel para evitar halos. Por supuesto, las operaciones morfológicas de ImageMagick no funcionan (¿todavía?) A nivel de subpíxeles, por lo que pueden ver que estoy haciendo explotar el canal alfa al 200% antes de erosionarlo.

Comparación de resultados

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

El simple reemplazo del blanco por transparente no siempre funciona El canal alfa suavizado y el relleno de inundación se ven mucho mejor

Observe cómo la barba del mago ha desaparecido en el enfoque simple. Compare los bordes del asistente para ver cómo el alfa suavizado ayuda a que la figura se mezcle suavemente con el fondo.

Por supuesto, admito completamente que hay ocasiones en las que es posible que desee utilizar la solución más simple. (Por ejemplo: es mucho más fácil de recordar y si está convirtiendo a GIF, está limitado a alfa de 1 bit de todos modos).

script de shell mktrans

Dado que es poco probable que desee escribir este comando repetidamente, le recomiendo envolverlo en un script. Puede descargar un script de shell BASH de github que realiza mi solución sugerida. Se puede ejecutar en varios archivos en un directorio e incluye comentarios útiles en caso de que desee modificar 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 excelentes porque todavía 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 de fuzz diferentes). Aquí hay un ejemplo de la salida de bg_removal.

El script bg_removal: tiene barba, pero carece de antialiasing


2
Necesitaba modificar el fuzz al 2%, porque la imagen contiene una máquina blanca con fondo blanco. Y aunque esto no es 100% perfecto, es la mejor solución que encontré ya que no quiero hacerlo manualmente gimpo lo que sea. :)
tukusejssirs

1
¡Excelente solución!
0x01h

29

Esto funciona para mi:

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

donde cuanto menor es el% de fuzz, más cerca del blanco verdadero o, por el contrario, cuanto mayor es el%, más variación del blanco se permite que se vuelva transparente


1
¡Guauu! ¡Esto es exactamente lo que necesitaba! antes: i.imgur.com/2Rd7w1N.png , después: i.imgur.com/4RTYygo.png
Dorian

No funciona perfectamente porque no puede manejar imágenes con color blanco y fondo blanco. como fotos de triunfo.
Jefe del equipo de programadores de PHP Sr.

Para blanco sobre blanco, intente usar la solución de relleno por inundación que publiqué anteriormente . O use mi mktransscript de shell: github.com/hackerb9/mktrans
hackerb9

12

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 un fondo transparente.


4
La cáscara puede requerir algunas citas de (): convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
Jim K.

7

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

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

ingrese la descripción de la imagen aquí


Agradable. Me gusta que haya entendido la esencia en una línea sucinta. Esto es similar a uno de mis pasos intermedios mientras escribía el guión. Decidí no hacerlo porque (a) pierde demasiados detalles nítidos, (b) quería que la selección de color fuera obvia para que pudiera cambiarse fácilmente y (c) quería rellenar desde todos los bordes, no solo desde la parte superior -esquina izquierda. (Puede que haya otras cosas que me estoy olvidando en este momento).
hackerb9

2
PD: Voy a hacer una suposición salvaje de que "fmw" significa Fred M. Weinhaus. Si es así, ¡saludos, Dr. Weinhaus! Para cualquiera que no sepa quién es, escribió algunas de las investigaciones fundamentales en gráficos por computadora a partir de la década de 1970. Todo el mundo debería ver su increíble conucopia de scripts de shell de ImageMagick en fmwconcepts.com/imagemagick .
hackerb9

1
@ hackerb9: Sí, ese soy yo. ¿Nos conocemos? Envíeme un correo electrónico si lo desea. Mi dirección de correo electrónico está en la página web que vinculó.
fmw42

4

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 de salida final debe tener la extensión .png para que sea transparente.

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

1

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.