J'ai une image png transparente "foo.png" Et j'ai ouvert une autre image avec
im = Image.open("foo2.png");
maintenant, ce dont j'ai besoin, c'est de fusionner foo.png avec foo2.png.
(foo.png contient du texte et je veux l'imprimer sur foo2.png)
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
Le premier paramètre à .paste()
est l'image à coller. Deuxièmement, les coordonnées et la sauce secrète est le troisième paramètre. Il indique un masque qui sera utilisé pour coller l'image. Si vous transmettez une image avec transparence, le canal alpha est utilisé comme masque.
Vérifiez les docs .
Image.paste
ne fonctionne pas comme prévu lorsque l'image d'arrière-plan contient également de la transparence. Vous devez utiliser real Alpha Compositing .
Pillow 2.0 contient une fonction alpha_composite
qui le fait.
background = Image.open("test1.png")
foreground = Image.open("test2.png")
Image.alpha_composite(background, foreground).save("test3.png")
EDIT: Les deux images doivent être du type RGBA. Vous devez donc appeler convert('RGBA')
si elles sont palettisées, etc. Si l’arrière-plan n’a pas de canal alpha, vous pouvez utiliser la méthode de collage standard (qui devrait être plus rapide).
Comme olt déjà souligné, Image.paste
ne fonctionne pas correctement, lorsque la source et la destination contiennent toutes les deux un alpha.
Considérez le scénario suivant:
Deux images de test, les deux contiennent alpha:
layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")
Image de composition utilisant Image.paste
comme suit:
final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
produit l'image suivante (la partie alpha des pixels rouges superposés est entièrement extraite du deuxième calque. Les pixels ne sont pas correctement fondus):
Image de composition utilisant Image.alpha_composite
comme suit:
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
produit l'image (correcte) suivante:
On peut aussi utiliser le blending:
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
Avait une question similaire et avait du mal à trouver une réponse. La fonction suivante vous permet de coller une image avec un paramètre de transparence sur une autre image à un décalage spécifique.
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()
def trans_paste(bg_img,fg_img,box=(0,0)):
fg_img_trans = Image.new("RGBA",bg_img.size)
fg_img_trans.paste(fg_img,box,mask=fg_img)
new_img = Image.alpha_composite(bg_img,fg_img_trans)
return new_img