Appliquer 2 fonctions putalpha à 1 seule image

liliice -  
 badamuse -

Bonjour,

Je cherche à faire une modification d'image sur python (avec PIL) pour un devoir. 

J'ai une image, je lui applique un premier programme pour rogner en quelque sorte l'image en cercle. Avec un programme qui créer un "mask" transparent autour. 

def circle_transparent(pil_img, blur_radius, offset=0):
    offset = blur_radius * 2 + offset
    mask = Image.new("L", pil_img.size, 0)
    draw = ImageDraw.Draw(mask)
    draw.ellipse((offset, offset, pil_img.size[0] - offset, pil_img.size[1] - offset), fill=255)
    mask = mask.filter(ImageFilter.GaussianBlur(blur_radius))
    result = pil_img.copy()
    result.putalpha(mask)
    return result

Puis j'applique cette fonction : 

imagePomme= circle_transparent(imagePomme, 4)
imagePomme.save("Pomme_circle.png")
imagePomme = Image.open("Pomme_circle.png")

Après, je souhaite rendre légèrement transparente l'image, donc j'utilise donc la fonction putalpha comme ceci : 

imagePomme.putalpha(70)
imagePomme.save("Pomme_putalpha.png")
imagePomme= Image.open("Pomme_putalpha.png")

Ensuite j'affiche l'image Pomme.

Si je fais le programme dans ce sens, à la fin on ne m'affiche que l'image pomme légèrement transparente et si j'inverse les deux éléments, on ne m'affiche que l'image rogner en cercle. 

Je n'arrive pas à cumuler les deux. J'ai donc penser qu'on ne pouvait utiliser qu'une seule fonction putalpha à la fois. J'ai tenté de mettre la seconde fonction putalpha dans "circle_transparent", sans succès. 

J'ai aussi essayé de renommer les fichiers images pour être sûr que le deuxième programme prenne bien l'image modifier juste avant et pas l'image ouverte au tout début du programme, mais toujours sans succès. 

Quelqu'un aurait-il déjà rencontré cette situation ? Ou quelqu'un serait-il en capacité de m'aider ? 

Merci. 

A voir également:

4 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

bonjour,

Je ne pense pas que tu puisses ainsi appliquer deux couches alpha.

Si j'étais toi, j'essaierais de jouer sur la valeur de fill pour adapter la transparence.

0
li
 

Comment je pourrais faire ? (je débute sur python)

0
jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720 > li
 

fill=128

0
jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 

Bonjour,

Tu pourrais combiner les couches alpha de 2 images

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFilter

def circle_transparent(pil_img, blur_radius, offset=0):
    offset = blur_radius * 2 + offset
    mask = Image.new("L", pil_img.size, 0)
    draw = ImageDraw.Draw(mask)
    draw.ellipse((offset, offset, pil_img.size[0] - offset, pil_img.size[1] - offset), fill=255)
    mask = mask.filter(ImageFilter.GaussianBlur(blur_radius))
    result = pil_img.copy()
    result.putalpha(mask)
    return result

imagePomme = Image.open("Pomme.png")
imagePomme2 = Image.new("RGBA", imagePomme.size, "white")

imagePomme = circle_transparent(imagePomme, 4)
imagePomme.save("Pomme_circle.png")

imagePomme2.putalpha(70)
imagePomme2.save("Pomme_putalpha.png")

imagePomme3 = Image.alpha_composite(imagePomme, imagePomme2)
imagePomme3.save("Pomme_mixed.png")

imagePomme3.show()

0
li
 

Bonjour, j'ai essayé votre programme mais cela n'a pas marché. Je pense que c'est parce qu'à la fin j'utilise déjà la fonction alpha_composite pour coller l'image sur une autre. 

Une autre suggestion ? 

0
jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 

Déjà il faudrait donner le code. Puis, il faut tout exposer au départ. Si on n'a pas le problème dans sa totalité, on ne va pas imaginer, ni prendre en compte, ce qu'on ignore et qui se passe après.


0
badamuse
 

Salut.

D'abord récupérer le canal alpha de ton image, puis appliquer la transparence voulue à l'image, ensuite, créer une nouvelle image en mode RGBA,  y copier l'image d'origine en utilisant en mask le canal alpha précédemment récupéré.

Ce qui donne :

# Puis après je souhaite rendre légèrement transparente l'image, j'utilise donc la fonction
image_pomme = Image.open("Pomme_circle.png")
# récupération des parties alpha de l'image
mask = image_pomme.getchannel('A')
# mask.show()
# application d'une transparence sur toute l'image
image_pomme.putalpha(160)
# nouvelle image en mode rgba
img = Image.new('RGBA', imagePomme.size)
# copie de image_pomme sur l'image en utilisant le mask alpha
img.paste(image_pomme, (0, 0, *image_pomme.size), mask)
img.show()
# enregister img si besoin.
0