Saltar al contenido

Cómo fusionar una imagen png transparente con otra imagen usando PIL

Solución:

from PIL import Image

background = Image.open("test1.png")
foreground = Image.open("test2.png")

background.paste(foreground, (0, 0), foreground)
background.show()

Primer parámetro a .paste() es la imagen a pegar. En segundo lugar están las coordenadas, y la salsa secreta es el tercer parámetro. Indica un máscara que se utilizará para pegar la imagen. Si pasa una imagen con transparencia, entonces el canal alfa se usa como máscara.

Consulte los documentos.

Image.paste no funciona como se esperaba cuando la imagen de fondo también contiene transparencia. Necesita utilizar composición Alpha real.

Pillow 2.0 contiene un alpha_composite función que hace esto.

background = Image.open("test1.png")
foreground = Image.open("test2.png")

Image.alpha_composite(background, foreground).save("test3.png")

EDITAR: Ambas imágenes deben ser del tipo RGBA. Entonces necesitas llamar convert('RGBA') si tienen paleta, etc. Si el fondo no tiene un canal alfa, entonces puede usar el método de pegado normal (que debería ser más rápido).

Como olt ya señalado, Image.paste no funciona correctamente, cuando la fuente y el destino ambos contienen alfa.

Considere el siguiente escenario:

Dos imágenes de prueba, ambas contienen alfa:

ingrese la descripción de la imagen aquí


ingrese la descripción de la imagen aquí

layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")

Composición de imágenes usando Image.paste al igual que:

final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)

produce la siguiente imagen (la parte alfa de los píxeles rojos superpuestos se toma completamente de la segunda capa. Los píxeles no se combinan correctamente):

ingrese la descripción de la imagen aquí

Composición de imágenes usando Image.alpha_composite al igual que:

final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)

produce la siguiente imagen (correcta):

ingrese la descripción de la imagen aquí

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *