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

Tengo una imagen png transparente “foo.png” y abrí otra imagen con

im = Image.open("foo2.png"); 

ahora lo que necesito es combinar foo.png con foo2.png.

(foo.png contiene texto y quiero imprimir ese texto en foo2.png)

 import Image background = Image.open("test1.png") foreground = Image.open("test2.png") background.paste(foreground, (0, 0), foreground) background.show() 

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

Revisa los documentos .

Image.paste no funciona como se esperaba cuando la imagen de fondo también contiene transparencia. Necesitas usar Real Compositing Alpha .

Pillow 2.0 contiene una función alpha_composite 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. Por lo tanto, debe llamar a convert('RGBA') si están paleteados, etc. Si el fondo no tiene un canal alfa, puede usar el método de pegado regular (que debería ser más rápido).

Como olt ya señaló, Image.paste no funciona correctamente, cuando el origen y el destino contienen alfa.

Considere el siguiente escenario:

Dos imágenes de prueba, ambas contienen alfa:

introduzca la descripción de la imagen aquí introduzca la descripción de la imagen aquí

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

Compositing image usando Image.paste así:

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

introduzca la descripción de la imagen aquí

Compositing image usando Image.alpha_composite así:

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

produce la siguiente imagen (correcta):

introduzca la descripción de la imagen aquí

También se puede utilizar la mezcla:

 im1 = Image.open("im1.png") im2 = Image.open("im2.png") blended = Image.blend(im1, im2, alpha=0.5) blended.save("blended.png") 

Tenía una pregunta similar y tenía dificultades para encontrar una respuesta. La siguiente función le permite pegar una imagen con un parámetro de transparencia sobre otra imagen en un desplazamiento específico.

 import Image def trans_paste(fg_img,bg_img,alpha=1.0,box=(0,0)): fg_img_trans = Image.new("RGBA",fg_img.size) fg_img_trans = Image.blend(fg_img_trans,fg_img,alpha) bg_img.paste(fg_img_trans,box,fg_img_trans) return bg_img bg_img = Image.open("bg.png") fg_img = Image.open("fg.png") p = trans_paste(fg_img,bg_img,.7,(250,100)) p.show()