IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Gestion d'images transparentes


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 32
    Points : 36
    Points
    36
    Par défaut Gestion d'images transparentes
    Bonjour,
    J'utilise actuellement Python 2.7 et la bibliothèque PIL (v 1.1.7).

    Je cherche désespérément un moyen de supprimer un morceau d'image transparente:
    J'ai une image transparente sur laquelle ce situe des images (non transparentes). J'aimerais supprimer une zone en la faisant devenir transparente.

    Par exemple passé de cela:


    A cela: (sachant que les images sont sur fond transparent)


    Voilà, en espérant que vous pourrez m'aider.

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Sous PIL on passe par un 'paste' d'une image (masque) transparente.

    Un exemple d'utilisation avec Tkinter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    import Tkinter as tk
    from PIL import Image, ImageTk
     
     
    def Change():
        mask = Image.new("RGBA", (im.size[0]/2, im.size[1]/2), color=255)  # Création d'une image transparente
        photoimage.paste(mask, (im.size[0]/2, im.size[1]/2, im.size[0], im.size[1]))  # On colle l'image sur celle existante.
     
     
    root = tk.Tk()
    im = Image.open("e10.png")
    im = im.convert("RGBA")  # Etre sur d'avoir une image avec transparence
    photoimage = ImageTk.PhotoImage(im)  # Conversion en image exploitable par Tk
    lab = tk.Label(root, image=photoimage, bg="red")
    lab.pack(fill="both")
    tk.Button(root, text="Apply", command=Change).pack()
    root.mainloop()
    Ici j'utilise ImageTk.PhotoImage.paste pour coller une image transparente (Image.new("RGBA", (im.size[0]/2, im.size[1]/2), color=255)).

    Plus généralement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from PIL import Image, ImageDraw
     
    im = Image.open('e10.png')
    im = im.convert("RGBA")
    size = im.size
    mask = Image.new('L', size, 0)
    draw = ImageDraw.Draw(mask)
    draw.rectangle((size[0]-size[0]/2, size[1]-size[1]/2, size[0], size[1]), fill=255)
    im.paste(0, mask=mask)
    im.save('e11.png')
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Re,

    Pour compléter.

    Vous pouvez aussi travailler plus finement, au pixel.
    Un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    import Tkinter as tk
    from PIL import Image, ImageTk
     
     
    def Change():
        global line
        for x in range(1, size[0]):
            im.putpixel((x, line), 255)
        photoimage = ImageTk.PhotoImage(im)
        lab.config(image=photoimage)
        lab.image = photoimage
        if line > 1:
            line -= 1
            root.after(250, Change)
        else:
            but.config(text="Quit", state="normal", command=root.destroy)
     
    root = tk.Tk()
    im = Image.open("e10.png")
    im = im.convert("RGBA")
    size = im.size
    line = im.size[1] - 1
    photoimage = ImageTk.PhotoImage(im)
    lab = tk.Label(root, image=photoimage, bg="red")
    lab.image = photoimage
    lab.pack(fill="both")
    but = tk.Button(root, text="Apply", command=lambda : but.config(state="disable") or Change())
    but.pack()
    root.mainloop()
    Mais vous comprendrez que ce n'est pas a utiliser pour des gros traitements ou vous préférez un 'masque' comme montré plus haut.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 32
    Points : 36
    Points
    36
    Par défaut
    Merci !

    Personnellement j'utilise actuellement PyGame pour un projet, j'ai donc choisie ton code fonctionnant simplement avec PIL.

    Quand j'ai fais le test avec mon image d'étoile, seul le rectangle définie dans ton code était transparent, la transparence d'origine (fond de l'étoile) était remplacé par du vert.

    Mais comme je n'utilise pas l'image de l'étoile en 32*32 dans mon code (mais une image transparente composée dans le programme), le code que tu m'a fournie fonctionne.

    (Le problème que j'ai eu doit donc venir d'un problème d'import de l'image.)

    En tout cas merci.

  5. #5
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Si l'image présente du vert c'est qu'elle est en RGB et non RGBA : C'était le cas pour e10.png donné en exemple (voir le im.convert("RGBA") dans le code donné plus haut).

    @+
    Merci d'utiliser le forum pour les questions techniques.

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    J'allais oublier : im.mode
    mode

    im.mode => string

    Image mode. This is a string specifying the pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
    @+
    Merci d'utiliser le forum pour les questions techniques.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. rendre une image transparente
    Par nabil dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 12/06/2005, 13h53
  2. rendre une image transparente
    Par matt92700 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 02/06/2005, 08h42
  3. Classe de gestion des images
    Par tlemcenvisit dans le forum MFC
    Réponses: 2
    Dernier message: 03/05/2005, 19h07
  4. Class de gestion des images avec rotation
    Par Johnny Boy dans le forum MFC
    Réponses: 1
    Dernier message: 03/05/2005, 11h54
  5. [TP]Gestion des images bmp avec BMP.TPU
    Par Gabi dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 14/05/2004, 23h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo