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:
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):
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):