Appliquer 2 fonctions putalpha à 1 seule image
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.
- Appliquer 2 fonctions putalpha à 1 seule image
- Image iso - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
- Word numéro de page 1/2 - Guide
- 2 ecran pc - Guide
- Acronis true image - Télécharger - Sauvegarde
4 réponses
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.
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()
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.
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.
Comment je pourrais faire ? (je débute sur python)
fill=128