Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope
Python & Zope Forum d'entraide sur la programmation en Python et Zope. Avant de poster -> F.A.Q Python
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/02/2013, 22h26   #1
TimDark
Futur Membre du Club
 
Homme
Inscription : janvier 2013
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : janvier 2013
Messages : 26
Points : 18
Points : 18
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.
TimDark est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 08h45   #2
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 613
Détails du profil
Informations personnelles :
Nom : Homme Patrice BLANGARIN
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 613
Points : 3 724
Points : 3 724
Bonjour,

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

Un exemple d'utilisation avec Tkinter :
Code :
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 :
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.
PauseKawa est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/02/2013, 09h21   #3
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 613
Détails du profil
Informations personnelles :
Nom : Homme Patrice BLANGARIN
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 613
Points : 3 724
Points : 3 724
Re,

Pour compléter.

Vous pouvez aussi travailler plus finement, au pixel.
Un exemple :
Code :
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.
PauseKawa est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 12h44   #4
TimDark
Futur Membre du Club
 
Homme
Inscription : janvier 2013
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : janvier 2013
Messages : 26
Points : 18
Points : 18
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.
TimDark est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 12h53   #5
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 613
Détails du profil
Informations personnelles :
Nom : Homme Patrice BLANGARIN
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 613
Points : 3 724
Points : 3 724
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.
PauseKawa est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 13h04   #6
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 613
Détails du profil
Informations personnelles :
Nom : Homme Patrice BLANGARIN
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 613
Points : 3 724
Points : 3 724
J'allais oublier : im.mode
Citation:
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.
PauseKawa est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h45.


 
 
 
 
Partenaires

Hébergement Web