web-dev-qa-db-fra.com

Comment fusionner une image png transparente avec une autre image à l'aide de PIL

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)

119
Arackna
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 .

211
nosklo

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

53
olt

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:

 enter image description here  enter image description here

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

 enter image description here

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:

 enter image description here

35
P.Melch

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")
6
nvd

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()
0
lee
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
0
陈旭周记