Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 16 sur 16
  1. #1
    Invité de passage
    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 : 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.

  2. #2
    Expert Confirmé

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 883
    Points : 2 895
    Points
    2 895

    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.
    Vincent
    Oqapy . Qarte . PaQager

  3. #3
    Invité de passage
    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 : 1
    Points
    1

    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 Confirmé

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 883
    Points : 2 895
    Points
    2 895

    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.
    Vincent
    Oqapy . Qarte . PaQager

  5. #5
    Invité de passage
    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 : 1
    Points
    1

    Par défaut

    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

  6. #6
    Expert Confirmé

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 883
    Points : 2 895
    Points
    2 895

    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 :
    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

  7. #7
    Invité de passage
    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 : 1
    Points
    1

    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 :
    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 :
    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 :
    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 Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    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 720
    Points : 3 953
    Points
    3 953

    Par défaut

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

  9. #9
    Invité de passage
    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 : 1
    Points
    1

    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 :
    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

  10. #10
    Expert Confirmé Avatar de PauseKawa
    Homme Profil pro Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    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 720
    Points : 3 953
    Points
    3 953

    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
    Invité de passage
    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 : 1
    Points
    1

    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 Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    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 720
    Points : 3 953
    Points
    3 953

    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
    Invité de passage
    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 : 1
    Points
    1

    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 Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    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 720
    Points : 3 953
    Points
    3 953

    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 Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    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 720
    Points : 3 953
    Points
    3 953

    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
    Invité de passage
    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 : 1
    Points
    1

    Par défaut

    It works ! Merci je vais enfin pouvoir me remettre à coder ! Milles merci

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •