Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > GUI > Tkinter
Tkinter Forum d'entraide sur Tkinter et compatible (Tix, Pmw, ...). Avant de poster -> FAQ Tkinter
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 07/02/2013, 17h30   #1
Nainpoleon
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 28
Points : 1
Points : 1
Par défaut Agrandir/Rétrécir une image

Bonjour à tous,

J'utilise Python en version 3.3, et suis donc obligé d'utiliser la classe PhotoImage pour traiter mes images (PIL n'étant pas encore sortit pour les versions 3.x de Python).

J'aimerai rétrécir/agrandir une image que j'affiche dans un Canvas pour que sa taille corresponde à la taille du Canvas. Ainsi à l'ouverture elle le remplirait, et lors de l'agrandissement/rétrécissement de la fenêtre, l'image remplirait automatiquement les nouvelles dimensions du Canvas.

J'ai donc trouvé deux méthodes zoom, et subsample, cependant elles ne prennent pas en paramètres de float (uniquement des entiers). Je suis donc coincé.

Auriez vous une solution ?

Toute aide est la bienvenue.
Nainpoleon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2013, 18h15   #2
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 936
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 936
Points : 1 402
Points : 1 402
Et qu'est-ce qui te gêne de convertir tes float en int ?

Autant le savoir: il n'y a pas de demi-pixel.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2013, 09h14   #3
Nainpoleon
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 28
Points : 1
Points : 1
La valeur en float correspond au facteur d'agrandissement/rétrécissement de l'image pour qu'elle puisse remplir le widget. Elle ne correspond pas à la valeur d'un pixel.

Je ne veux pas zoomer sur une partie de l'image, je veux pouvoir voir toute mon image dans mon widget.
Nainpoleon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2013, 12h28   #4
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 936
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 936
Points : 1 402
Points : 1 402
Oui, d'accord le facteur de zoom est un float, mais cela ne change rien.

En pseudo-code:

nouvelle_largeur = largeur_image * facteur_zoom
nouvelle_hauteur = hauteur_image * facteur_zoom
image_resize(int(nouvelle_largeur), int(nouvelle_hauteur))


La perte sera inférieure à un pixel.
On procède de la même manière avrc d'autre frameworks graphiques.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2013, 14h58   #5
Nainpoleon
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 28
Points : 1
Points : 1
Je n'utilises pas PIL je n'ai donc pas de méthode resize sur mon objet :/.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
def onResize(self):
		old_image_w = self.photo.width()
		old_image_h = self.photo.height()
 
		new_image_w = self.canvas.winfo_reqwidth()
		new_image_h = self.canvas.winfo_reqheight()
 
		scale_w = new_image_w/old_image_w
		scale_h = new_image_h/old_image_h
 
		self.photo.zoom(scale_w, scale_h) #Ne fonctionne pas car ne prends pas de float en paramètres
		self.canvas.itemconfigure(self.item_photo, image=self.photo)
Et caster mon scale me fera perdre bien plus que 1px ....


EDIT; suis tombé sur cet article, qui me fait un peu peur... http://effbot.org/zone/tkinter-photo...scale-ramp.htm
Nainpoleon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2013, 18h31   #6
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 936
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 936
Points : 1 402
Points : 1 402
Citation:
Envoyé par Nainpoleon Voir le message
Je n'utilises pas PIL je n'ai donc pas de méthode resize sur mon objet :/.
Pseudo code ça veut dire que c'est pas pour du vrai (c'est pour du beurre, quoi).

Citation:
Envoyé par Nainpoleon Voir le message
Code :
1
2
3
 
		self.photo.zoom(scale_w, scale_h) #Ne fonctionne pas car ne prends pas de float en paramètres
		self.canvas.itemconfigure(self.item_photo, image=self.photo)
Ha, tu ne peux pas lui passer les dimensions du canevas, dans ce cas tu dois arrondir ton facteur de zoom à l'unité supérieure.

Par contre, mon exemple, un peu simpliste est bugué puisqu'il fait usage de deux facteurs différents ce qui entraînera une distorsion de l'image. Il faudra, donc ajouter une ligne de code pour choisir celui des deux facteurs de zoom qui donnera une taille d'image la plus proche de celle du canevas.

Le lien que tu donnes dit justement que Tk ne peux faire plus que cela en matière de redimensionement.


Tu es sous Windows ? Il existe une compilation de PIL pour Python3
http://www.lfd.uci.edu/~gohlke/pythonlibs/

Pour Linux il y a Pillow, un fork de PIL
http://blog.aclark.net/2013/01/10/pillow-python-3/
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 17h51   #7
Nainpoleon
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 28
Points : 1
Points : 1
Salut,

Les possibilités de Tkinter étant trop limité j'ai cherché à installer PIL, je suis donc passé sur une version python 2.7.

Depuis 2-3 jours j'essaye de résoudre des problèmes liés à l'installation... j'ai tellement tenté de trucs que j'aimerai bien faire un pit remove de tout ça^^.

Je ne trouves pas les réponses a mon problème donc je vais vous poster le TraceBack à l'import d'une image de format quelconque (gif, jpg,...) :

Citation:
Code :
1
2
3
self.orig_img = Image.open(self.chemin_image)
self.image = PhotoImage(file=self.orig_img)
self.canvas.itemconfigure(self.image_id, image=self.image)
Citation:
Code :
1
2
3
4
5
6
7
8
9
10
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1437, in __call__
    return self.func(*args)
  File "./interface_v2.py", line 137, in onOpenFile
    self.image = PhotoImage(file=self.orig_img)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 3271, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 3227, in __init__
    self.tk.call(('image', 'create', imgtype, name,) + options)
TclError: couldn't open "<PIL.GifImagePlugin.GifImageFile image mode=P size=260x271 at 0x1FB76C8>": no such file or directory

Citation:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ python selftest.py
--------------------------------------------------------------------
PIL 1.1.7 TEST SUMMARY 
--------------------------------------------------------------------
Python modules loaded from ./PIL
Binary modules loaded from ./PIL
--------------------------------------------------------------------
--- PIL CORE support ok
*** TKINTER support not installed
--- JPEG support ok
--- ZLIB (PNG/ZIP) support ok
--- FREETYPE2 support ok
*** LITTLECMS support not installed
--------------------------------------------------------------------
Running selftest:
--- 57 tests passed.
Nainpoleon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 19h11   #8
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 608
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 608
Points : 3 715
Points : 3 715
Bonsoir,

Léger mélange dans tout cela
Code :
1
2
3
4
 
self.orig_img = Image.open(self.chemin_image)  # Ouverture de l'image avec PIL
self.image = ImageTk.PhotoImage(self.orig_img)  # Création d'une image compatible
self.canvas.itemconfigure(self.image_id, image=self.image)
@+

Edit : pour ce qui est de l'erreur
Citation:
TclError: couldn't open "<PIL.GifImagePlugin.GifImageFile image mode=P size=260x271 at 0x1FB76C8>": no such file or directory
Code :
self.orig_img = Image.open(self.chemin_image)
Vous ouvrez l'image avec PIL
Code :
self.image = PhotoImage(file=self.orig_img)
Vous utilisez Tkinter.PhotoImage pour ouvrir une image(file=) et vous donnez un objet PIL (couldn't open "<PIL.GifImagePlugin.GifImageFile image mode=P size=260x271 at 0x1FB76C8>")

@++
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 19h40   #9
Nainpoleon
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 28
Points : 1
Points : 1
Je vois, il existe deux classe nommée de la même manière et la mauvaise était utilisée...

Par contre cela me renvoi une nouvelle erreur :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
ImportError: No module named _imagingtk
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1437, in __call__
    return self.func(*args)
  File "./interface_v2.py", line 137, in onOpenFile
    self.image = ImageTk.PhotoImage(self.orig_img)
  File "/usr/local/lib/python2.7/dist-packages/PIL/ImageTk.py", line 116, in __init__
    self.paste(image)
  File "/usr/local/lib/python2.7/dist-packages/PIL/ImageTk.py", line 181, in paste
    import _imagingtk
ImportError: No module named _imagingtk
Voici mes import..

Code :
1
2
3
from Tkinter import *
import tkMessageBox, tkFileDialog
from PIL import Image, ImageTk
Nainpoleon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 19h54   #10
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 608
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 608
Points : 3 715
Points : 3 715
Là, effectivement il y a un souci d'installation.
Regardez si vous avez le fichier _imagingtk.dll (Windows)/ _imagingtk.so (Linux - Votre cas il me semble).
Sinon quel packet/deb avez vous installé ?
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 20h18   #11
Nainpoleon
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 28
Points : 1
Points : 1
Sur le site officiel http://www.pythonware.com/products/pil/

PIL 1.1.7 -> Python Imaging Library 1.1.7 Source Kit (all platforms) (November 15, 2009)


J'ai fais une recherche dans usr/lib, le fichier semble manquant.
Nainpoleon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 20h21   #12
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 608
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 608
Points : 3 715
Points : 3 715
Citation:
patrice@Zeus:~$ locate _imagingtk.so
/usr/lib/pyshared/python2.6/PIL/_imagingtk.so
/usr/lib/pyshared/python2.7/PIL/_imagingtk.so
/usr/lib/python2.6/dist-packages/PIL/_imagingtk.so
/usr/lib/python2.7/dist-packages/PIL/_imagingtk.so
Et votre distribution ?
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 20h26   #13
Nainpoleon
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 28
Points : 1
Points : 1
Ubuntu 12.10

Je vais regarder dans les dossiers PIL mais il me semble pas les avoir vus.

EDIT: Effectivement seuls _imaging.so, _imagingcms.so, imagingft.so et _imagingmath.so sont dans le dossier. (usr/lib/python2.7/PIL)

EDIT: J'avais mal compris votre citation, j'ai testé ça ne renvoie rien. Merci pour l'astuce d'ailleurs.
Nainpoleon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 20h36   #14
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 608
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 608
Points : 3 715
Points : 3 715
Sous Quantal le deb a installer via la logithèque est python-imaging et ImageTk est dans le deb python-imaging-tk.
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 20h55   #15
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 608
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 608
Points : 3 715
Points : 3 715
Citation:
Envoyé par Nainpoleon Voir le message
EDIT: Effectivement seuls _imaging.so, _imagingcms.so, imagingft.so et _imagingmath.so sont dans le dossier. (usr/lib/python2.7/PIL)
Je n'avais pas cet edit : Installez python-imaging-tk via la logithèque.
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 21h17   #16
Nainpoleon
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 28
Points : 1
Points : 1
It works ! Merci je vais enfin pouvoir me remettre à coder ! Milles merci
Nainpoleon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h57.


 
 
 
 
Partenaires

Hébergement Web