Bonjour,
je veux afficher une image dans un canevas et je voudrais qu'elle soit redimensionnée pour coller à la taille du canevas. J'utilise PIL et PhotoImage. Est ce que vous pouvez m'aider?
Merci!
Version imprimable
Bonjour,
je veux afficher une image dans un canevas et je voudrais qu'elle soit redimensionnée pour coller à la taille du canevas. J'utilise PIL et PhotoImage. Est ce que vous pouvez m'aider?
Merci!
Salut, voici un lien qui pourra d'aider.
http://python.developpez.com/faq/?page=Canvas
Faites des tests
;)
J'ai testé et il me dit :
File "main.py", line 16, in imgaffiche
img = Image.open(imgfile1)
AttributeError: class Image has no attribute 'open'
Pourtant j'ai bien importé Image de PIL
Vérifie que tu n'as pas redéfini la variable Image
non, j'ai ça:
Mais je ne touche pas au nom des modulesCode:
1
2
3
4
5
6 from PIL import Image, ImageTk ... ... img = Image.open(imgfile1) #imgfile1 contient le nom du fichier biensur photo = ImageTk.PhotoImage(image) can.create_image(0,0, anchor = NW, image=photo)
Justement, vérifie qu'entre les lignes que tu as donné tu n'as pas défini autre chose nommé Image. Tu peux aussi essayer
Code:
1
2 print dir(Image) #affiche la liste des méthodes disponibles print Image.__file__ #affiche le nom du fichier contenant l'objet Image
open est bien dans la liste des méthode.
L'aide sur Image.open me dit:
Help on function open in module PIL.Image:
open(fp, mode='r')
Open an image file, without loading the raster data
J'ai donc essayer avec l'option 'r' mais ça ne change rien.
La variable __file__ contient C:\Python25\lib\site-packages\PIL\Image.pyc. Il faut le changer? (je ne sais pas à quoi ça correspond)
j'ai remarqué une erreur d'après l'exemple.
Dans ce code tu ouvre ton image virtuellement.
Ensuite, tu le mets dans ta fenêtre. Mais tu n'a pas mis correctement la variable.
tu devrais mettre img et non image :
J'espère que cela résoudra ton problème.Code:
1
2 photo = ImageTk.PhotoImage(img)
:D
merci!
cette boulette est corrigée mais le soucis n'était même pas arrivé jusque là puisqu'il plante sur l'instruction précédente. Il n'aime vraiment pas le open...
c'est quoi ta version de python?
2.5 que j'utilise sur PythonWin
Bon, après relecture du message d'erreur, l'interpréteur signale que tu disposes d'une classe nommée Image, ce qui interfère avec le module. Les variables que j'ai voulu que tu affiches, c'était dans ton code, histoire de voir si quelque chose interfère. Et effectivement tu sembles avoir une classe nommée Image, rendant le module Image inaccessible.
Je n'utilise plus Tkinter depuis un petit moment mais lorsque je rencontre un problème qui ressemble un peu au tien (à savoir utilisation d'un bout de code de la faq, et utilisation non concluante...), je repars depuis le début.
Le lien que Petugnia t'as donné fonctionne. Lance le dans le même répertoire que celui où tu as ta photo et procède à une personnalisation pas à pas...
Tu tombera bien à un moment ou à un autre sur ce qui te bloque.
Bon courage:ccool:
J'ai trouvé mais je reste une quiche!(l'honneur est sauf! :D)
En fait, quand j'appelais Image.open(...), il cherchait la fonction open dans la classe Image, mais comme j'ai importé spécifiquement Image, il suffisait de mettre open(...). De même, il fallait virer ImageTk dans ImageTk.PhotoImage(...).
La partie qui fait de moi une quiche, c'est que ça marche toujours pas! (bah oui ça aurait été trop beau...) J'ai donc droit à cette erreur:
Et là je comprend rien, sauf qu'il aime pas le create_image.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Exception in Tkinter callback Exception exceptions.AttributeError: "PhotoImage instance has no attribute '_PhotoImage__photo'" in <bound method PhotoImage.__del__ of <PIL.ImageTk.PhotoImage instance at 0x05CC63C8>> ignored Traceback (most recent call last): File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__ return self.func(*args) File "main.py", line 19, in imgaffiche can.create_image(0,0, anchor = NW, image=photo) File "C:\Python25\lib\lib-tk\Tkinter.py", line 2154, in create_image return self._create('image', args, kw) File "C:\Python25\lib\lib-tk\Tkinter.py", line 2145, in _create *(args + self._options(cnf, kw)))) TypeError: __str__ returned non-string (type file)
Pour recentrer le soucis, je veux redimensionner une image (avant de tripatouiller mon code, elle s'affichait bien).
En relisant la doc de PhotoImage, j'ai vu la fonction zoom(x,y) mais je ne vois pas à quoi correspondent les x et y. Est ce que ce sont les nouvelles tailles en pixels? Ou le nombre de pixel en plus que l'on voudrait? Ou encore le pourcentage? J'ai essayé avec les dimensions de mon canevas, mais ça n'a rien changé.
tu pourrai montrer ton code car l'erreur dit que qu'une variable n'est pas en string ???!!!
Donc ça pourrai nous aider à comprendre ton erreur.
:ccool:
je me suis inspiré de ton code pour mettre une image et j'ai exactement la même chose en python3, tout en faisant les modification nécéssaire
Code:
1
2
3
4
5
6
7
8 class logo: img = open("logo.ico") photo = PhotoImage(img) canvas = Canvas(fenetre, width = 40, height = 40, bg='lightblue') canvas.create_image(0,0, anchor = NW, image=photo) canvas.pack()
Bonjour,
Ça manque de code...
Si c'est pour redimensionner une image en fonction de ton Canvas, tu peux t'inspirer de ceci :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #!/usr/bin/python # -*- coding: utf-8 -*- from Tkinter import * from PIL import Image, ImageTk class TestResize: def __init__(self): self.root=Tk() self.image = Image.open("test.jpg") self.x, self.y = self.image.size self.can=Canvas(self.root,bg='white') self.can.bind("<Configure>",self.resize) self.can.pack(expand=Y,fill=BOTH) def resize(self,event): self.img=self.image.resize((event.width,event.height)) self.mon_image = ImageTk.PhotoImage(self.img) self.can.create_image(0, 0, image=self.mon_image, anchor=NW) app=TestResize() app.root.mainloop()
malheureusement pour moi je ne peux pas car PIL n'est pas adapté pour python 3.0. Également j'ai toujours la même erreur même en faisant les modifications nécessaire. :roll:
Vérifie tes imports, et si nécessaire relis ceci : Comment importer des modules/fonctions/fichiers ?
=> Donne la même erreur que toiCode:
1
2
3
4
5
6
7
8 from PIL import Image, ImageTk import Tkinter as Tk img = Image.open('image.jpg') root = Tk.Tk() photo = Tk.PhotoImage(img) can = Tk.Canvas(root, bg='white') can.pack(expand=Tk.Y, fill=Tk.BOTH) can.create_image(0, 0, image=photo, anchor=Tk.NW)
=> Fonctionne sans problèmeCode:
1
2
3
4
5
6
7
8 from PIL import Image, ImageTk import Tkinter as Tk img = Image.open('image.jpg') root = Tk.Tk() photo = ImageTk.PhotoImage(img) can = Tk.Canvas(root, bg='white') can.pack(expand=Tk.Y, fill=Tk.BOTH) can.create_image(0, 0, image=photo, anchor=Tk.NW)
Je souhaite reprendre ton dernier post pour éclaircir quelques points qui à mon avis t'ont échappé. (Les autres n'hésitez surtout pas à me corriger si je raconte des âneries...)
T'inquiètes pas je pense qu'on est tous passé par là. Au fait as-tu lu le tuto de G. SWINNEN (voir lien ci-dessous). Il est nikel pour commencer avec python et en particulier Tkinter.
Désolé de te dire ceci, mais je ne suis pas convaincu...
Je pense que justement si tu importes spécifiquement Image, tu dois le spécifier tout au long de ton code.
Je pense q'un import de PIL du genre
permettrait effectivement de ne pas avoir à rappeler systématiquement Image, ImageTk...Code:from PIL import *
Cependant ce genre d'import est fortement déconseillé.
Une nouvelle fois inspire toi du lien donné au début.
Peux-tu nous donner la manière dont tu importes Tkinter et aussi comment tu crées le canvas nommé can.
Je pense que ton problème peut aussi venir de là.
Je ne sais pas à quel niveau tu es dans ton apprentissage de python, mais ce que je te conseille c'est:
1°) Tuto de G. SWINNEN pour revoir les bases. Ce tuto est aussi à garder tout le temps à porté de main car s'il traite principalement de Tkinter je trouve qu'il est aussi exceptionnel car il permet de se replonger dans les listes, dictionnaires, tuple, appel de fonction... qui sont identiques pour toute les biblio graphiques.
2°) Quand tu auras bien maitrisé ceci et que tu commenceras à de balader, lis le tuto sur wxPython (deuxième lien ci-dessous). Premièrement à mon sens wxPython n'est pas plus compliqué que Tkinter (plus rigoureux certes et plus complets, mais pas plus compliqué), et deuxièmement devine quel est le fil rouge de ce tuto???:mrgreen:
Bon courage
L'erreur bizarre provient du conflit entre Tkinter.PhotoImage et ImageTk.PhotoImage. Il faut utiliser ImageTk.PhotoImage pour ne pas avoir cette erreur.
Concernant le zoom, déjà tu peux ne passer qu'un seul paramètre, qui se contentera d'agrandir l'image avec le facteur que tu as donné, et sinon, si tu veux redimensionner différemment selon x et y, il faut que tu utilises les deux paramètres.
Mathématiquement, image.zoom(a, b) revient à appliquer l'application linéaire de matrice [[a, 0], [0, b]] à chaque point de l'image.
J'ai essayé avec un zoom(2) et comme ça marchait pas j'ai fait l'inverse : redimensionner le canvas à la taille de l'image, au final, c'est plus simple et ça marche!
Merci à tous pour vos réponses et votre aide!