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

Python Discussion :

[PIL] redimensionner une image avec resize


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    terminale S
    Inscrit en
    Juillet 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : terminale S

    Informations forums :
    Inscription : Juillet 2012
    Messages : 27
    Par défaut [PIL] redimensionner une image avec resize
    Bonjour, je travaille actuellement sur un projet python avec Tkinter.

    Je souhaite créer un canevas dans lequel j'affiche une image.
    Mais je souhaite redimensionner l'image avant, a l'aide de resize.

    voici mon code :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    from Tkinter import *
    from PIL import Image
     
    fen1 = Tk()
     
    # cr?ation de widgets 'Label' et 'Entry' :
    txt1 = Label(fen1, text ='Premier champ :')
    txt2 = Label(fen1, text ='Second :')
    txt3 = Label(fen1, text ='Troisi?me :')
    entr1 = Entry(fen1)
    entr2 = Entry(fen1)
    entr3 = Entry(fen1)
     
    # cr?ation d'un widget 'Canvas' contenant une image bitmap :
    photo = Image.open('diable.gif')
    resolution = (160,160)
    photo.resize(resolution)
    can1 = Canvas(fen1, width =160, height =160, bg ='white')
     
    item = can1.create_image(160, 160, image =photo)
     
     
     
    # Mise en page ? l'aide de la m?thode 'grid' :
    txt1.grid(row =1, sticky =E)
    txt2.grid(row =2, sticky =E)
    txt3.grid(row =3, sticky =E)
    entr1.grid(row =1, column =2)
    entr2.grid(row =2, column =2)
    entr3.grid(row =3, column =2)
    can1.grid(row =1, column =3, rowspan =3, padx =10, pady =5)
     
    # d?marrage :
    fen1.mainloop()
    quand je le lance, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Traceback (most recent call last):
      File "H:\Travail\ISN\Projet ISN Fin annee\Insertion image.py", line 34, in <module>
        item = can1.create_image(160, 160, image =photo)
      File "C:\Python27\lib\lib-tk\Tkinter.py", line 2198, in create_image
        return self._create('image', args, kw)
      File "C:\Python27\lib\lib-tk\Tkinter.py", line 2189, in _create
        *(args + self._options(cnf, kw))))
    TclError: image "<PIL.GifImagePlugin.GifImageFile image mode=P size=1024x968 at 0xEDDA08>" doesn't exist
    je ne vois pas d'où vient l'erreur.

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    L'image créée par PIL n'est pas directement utilisable dans un canvas, il faut en faire une ImageTk par PIL avant tout.

    D'autre part tu dois utiliser l'image en retour de resize(), le message d'erreur te montre d'ailleurs que c'est l'image non redimensionnée qui est passée au canvas.

    Ça donne à peu près ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    from PIL import Image, ImageTk
    ...
    can1 = Canvas(fen1, width =160, height =160, bg ='white')
    photo = Image.open('diable.gif')
    resolution = (160,160)
    img = ImageTk.PhotoImage(photo.resize(resolution))
    item = can1.create_image(0, 0, image=img)
    ...
    À tester ...

  3. #3
    Membre Expert 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
    Par défaut
    Bonjour,

    .subsample(), .zoom() ne suffisent pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    photo = PhotoImage(file="diable.gif")
    photo.zoom(160/photo.width(), 160/photo.height())
    @+

  4. #4
    Membre averti
    Homme Profil pro
    terminale S
    Inscrit en
    Juillet 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : terminale S

    Informations forums :
    Inscription : Juillet 2012
    Messages : 27
    Par défaut
    Voila mon nouveau code :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    from Tkinter import *
    from PIL import Image, ImageTk
     
    fen1 = Tk()
     
    # cr?ation de widgets 'Label' et 'Entry' :
    txt1 = Label(fen1, text ='Premier champ :')
    txt2 = Label(fen1, text ='Second :')
    txt3 = Label(fen1, text ='Troisi?me :')
    entr1 = Entry(fen1)
    entr2 = Entry(fen1)
    entr3 = Entry(fen1)
     
    # cr?ation d'un widget 'Canvas' contenant une image bitmap :
    can1 = Canvas(fen1, width =160, height =160, bg ='white')
    photo = Image.open('diable.gif')
    photo.show()
    resolution = (160,160)
    img = ImageTk.PhotoImage(photo.resize(resolution))
    item = can1.create_image(0, 0, image=img)
     
    # Mise en page ? l'aide de la m?thode 'grid' :
    txt1.grid(row =1, sticky =E)
    txt2.grid(row =2, sticky =E)
    txt3.grid(row =3, sticky =E)
    entr1.grid(row =1, column =2)
    entr2.grid(row =2, column =2)
    entr3.grid(row =3, column =2)
    can1.grid(row =1, column =3, rowspan =3, padx =10, pady =5)
     
    # d?marrage :
    fen1.mainloop()

    Mais cette fois ci j'obtients :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Traceback (most recent call last):
      File "<string>", line 254, in run_nodebug
      File "C:\python\isnprojetbac\Insertion image.py", line 34, in <module>
        item = can1.create_image(0, 0, image=img)
      File "C:\Python27\Lib\lib-tk\Tkinter.py", line 2198, in create_image
        return self._create('image', args, kw)
      File "C:\Python27\Lib\lib-tk\Tkinter.py", line 2189, in _create
        *(args + self._options(cnf, kw))))
    _tkinter.TclError: image "pyimage8" doesn't exist
    J'ai donc ajoutez la ligne "photo.show()" pour voir si l'image était ouverte, et c'est bien le cas.
    Donc je ne comprend pas.

  5. #5
    Membre Expert 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
    Par défaut
    Bonjour,

    Normalement pas de souci avec votre code, du moins chez moi.

    Le seul truc que je remarque qui pourrait perturber c'est que im.resize() retourne une nouvelle image et que vous ne la nommez pas sous Python.
    Vous pourriez écrire ceci pour tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    photo = photo.resize(resolution)
    img = ImageTk.PhotoImage(photo)
    item = can1.create_image(0, 0, image=img)
    @+

  6. #6
    Membre averti
    Homme Profil pro
    terminale S
    Inscrit en
    Juillet 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : terminale S

    Informations forums :
    Inscription : Juillet 2012
    Messages : 27
    Par défaut
    Toujours pareil...
    "pyimageX dosn't exist"

    Je ne comprend vraiment pas, surtout si le code fonctionne chez vous.

    J'ai eu le même problème avec un autre programme qui devait afficher une image dans un canvas sans la redimensionner.
    Chez moi j'obtenais "pyimageX dosn't exist" alors qu'au lycée cela marchais.


    Et tout a l'heure, le code dont il est question ici, sans redimensionnement a fonctionné la première fois, puis après j'ai obtenu "pyimage2 dosn't exist" et ainsi de suite.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/03/2015, 00h45
  2. Comment redimensionner une image avec GD ?
    Par pdtor dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 04/12/2009, 12h08
  3. Redimensionner une image avec getElementByID
    Par Gunner4902 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 14/08/2008, 17h47
  4. [GD] Redimensionner une image avec une taille fixe
    Par Aspic dans le forum Bibliothèques et frameworks
    Réponses: 29
    Dernier message: 20/07/2008, 14h57
  5. Afficher une image avec PIL
    Par O_connor dans le forum Tkinter
    Réponses: 3
    Dernier message: 12/04/2007, 14h39

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