2011-03-16 33 views

Respuesta

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

Compruebe el docs.

+4

¡guau! eso funciona !! gracias – Arackna

+5

me faltaba la salsa secreta, gracias! : D –

+5

Para asegurarse de que el primer plano contiene transparencia en todos los casos, use 'foreground.convert ('RGBA')' para el parámetro mask. –

45

Image.paste no funciona como se esperaba cuando la imagen de fondo también contiene transparencias. Necesita usar real Alpha Compositing.

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 al convert('RGBA') si tienen una paleta, etc. Si el fondo no tiene un canal alfa, puede usar el método de pegado normal (que debería ser más rápido).

+0

Acabo de usar paste() para superponer una imagen semitransparente en otra, con PIL, y funcionó como esperaba. ¿De qué manera no funciona como esperabas? –

+3

@PeterHansen, pegar() no funciona como se esperaba "cuando la imagen de fondo también contiene transparencia". – homm

+1

@PeterHansen Hay un ejemplo: https://github.com/python-pillow/Pillow/issues/924#issuecomment-61848826 – homm

17

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

cuenta la situación siguiente:

Dos imágenes de prueba, ambos contienen alfa:

enter image description here enter image description here

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

composición de imágenes 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 mezclan correctamente):

imagen Composición

enter image description here

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 imagen de la siguiente (correcto):

enter image description here

+0

¡Gracias por las capturas de pantalla! ¡Realmente ayuda! – Viet

+0

Pero 'alpha_composite' no puede establecer el desplazamiento, ¿le importaría dar un ejemplo para reemplazar completamente la función' paste'? – Mithril

+0

Supongo que tendrías que crear una nueva imagen vacía con el mismo tamaño que la imagen garget, pegar la capa en la posición correcta y usar alpha_compositing para combinar la nueva imagen sobre la imagen objetivo. –

3

Una lata también use blending:

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

Este trabajado ascéticamente para mí. Las imágenes deben tener exactamente el mismo tamaño, pero está bien. La función de pegar no me cortó por completo ... –

Cuestiones relacionadas