pil from book python image image-processing python-imaging-library

python - from - Cómo combinar una imagen png transparente con otra imagen usando PIL



pillow python (4)

Tengo una imagen png transparente "foo.png" y he abierto otra imagen con

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

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

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


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

Considere la siguiente situación:

Dos imágenes de prueba, ambas contienen alfa:

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

Compositing image usando Image.paste como tal:

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

Image.alpha_composite imagen usando Image.alpha_composite como tal:

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

produce la siguiente imagen (correcta):


También se puede usar blending:

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


Image.paste no funciona como se esperaba cuando la imagen de fondo también contiene transparencias. Debes usar la composición real de 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 tienen una paleta, 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).


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 usará para pegar la imagen. Si pasa una imagen con transparencia, entonces el canal alfa se usa como máscara.

Verifica los docs .