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. 

4 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    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
    1. li
       

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

      0
      1. jee pee Messages postés 31864 Date d'inscription   Statut Modérateur Dernière intervention   9 973 > li
         

        fill=128

        0
  2. jee pee Messages postés 31864 Date d'inscription   Statut Modérateur Dernière intervention   9 973
     

    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
    1. 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
  3. jee pee Messages postés 31864 Date d'inscription   Statut Modérateur Dernière intervention   9 973
     

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