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 .