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

  1. #1
    Membre à l'essai
    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
    Points : 17
    Points
    17
    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 éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    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
    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
    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 à l'essai
    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
    Points : 17
    Points
    17
    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
    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
    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 à l'essai
    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
    Points : 17
    Points
    17
    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.

  7. #7
    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
    Mais... Au fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _tkinter.TclError: image "pyimage8" doesn't exist
    Il y a déjà 7 images ?
    Vous utilisez quoi pour lancer votre code ? Il semblerai que vous le lanciez à partir d'une application en Tkinter. Ce qui expliquerais que Tkinter s'y perde dans les root Tk()

  8. #8
    Membre à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    J'utilise pyscripter.
    Mais je pense que vous avez raison, car la premiere fois il a fonctionné !

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

  10. #10
    Membre à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    Ah mais d'accord
    C'est pour cela que je n'arrivais jamais a insérer des image avec Tkinter !

    Merci beaucoup en tout cas !
    Si j'ai d'autre problème je reviendrai sur ce forum qui est bien agréable.

  11. #11
    Membre à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    et que me conseillez vous d'utiliser a la place ?

  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
    Vous pouvez toujours garder pyscripter et tester les différents moteurs (dans le menu run d'après la doc).
    Je viens de tester pyscripter dans une virtualbox et comme indiquer par magicvinni dans le lien donné plus haut cela ne fonctionne pas avec le moteur Distant (Tk).
    Votre code fonctionne avec le moteur local ou distant (Exécuter > Moteur Python).

    Après choisir un ide c'est plutôt personnel: A vous de tester et de voir celui qui vous conviens.

  13. #13
    Membre à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    En effet, le code fonctionne avec le moteur distant (remote).
    JE vais rester sous pyscripter, l'habitude ^^

    Merci encore.

+ 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