Appliquer 2 fonctions putalpha à 1 seule image

Fermé
liliice - Modifié le 3 mai 2023 à 12:31
 badamuse - 30 avril 2023 à 13:28

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 22731 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2024 1 477
Modifié le 3 mai 2023 à 12:31

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

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

0
jee pee Messages postés 39655 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 27 avril 2024 9 238 > li
30 avril 2023 à 10:22

fill=128

0
jee pee Messages postés 39655 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 27 avril 2024 9 238
Modifié le 3 mai 2023 à 12:32

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

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 39655 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 27 avril 2024 9 238
30 avril 2023 à 10:22

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

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