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

Tkinter Python Discussion :

Agrandir/Rétrécir une image


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 9
    Points
    9
    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.

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    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.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 9
    Points
    9
    Par défaut
    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.

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    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.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 9
    Points
    9
    Par défaut
    Je n'utilises pas PIL je n'ai donc pas de méthode resize sur mon objet :/.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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/

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 9
    Points
    9
    Par défaut
    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,...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

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

  8. #8
    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
    Bonsoir,

    Léger mélange dans tout cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    TclError: couldn't open "<PIL.GifImagePlugin.GifImageFile image mode=P size=260x271 at 0x1FB76C8>": no such file or directory
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.orig_img = Image.open(self.chemin_image)
    Vous ouvrez l'image avec PIL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 9
    Points
    9
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from Tkinter import *
    import tkMessageBox, tkFileDialog
    from PIL import Image, ImageTk

  10. #10
    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
    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.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 9
    Points
    9
    Par défaut
    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.

  12. #12
    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
    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.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 9
    Points
    9
    Par défaut
    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.

  14. #14
    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
    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.

  15. #15
    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
    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.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 9
    Points
    9
    Par défaut
    It works ! Merci je vais enfin pouvoir me remettre à coder ! Milles merci

Discussions similaires

  1. Animation : Agrandir puis rétrécir une image.
    Par JohnMalko dans le forum Powerpoint
    Réponses: 1
    Dernier message: 02/07/2011, 19h48
  2. Peut-on agrandir/rétrécir une image selon un Slider ?
    Par zouuc dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 15/10/2010, 10h52
  3. Ggrandir ou rétrécir une image
    Par marco62118 dans le forum SDL
    Réponses: 3
    Dernier message: 27/03/2010, 17h11
  4. Réponses: 3
    Dernier message: 19/01/2006, 14h08
  5. [Java2D]Agrandir une image
    Par Guybrush dans le forum 2D
    Réponses: 8
    Dernier message: 02/11/2005, 10h36

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