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 :

comment sauver une image issue d'un ScrolledText?


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 75

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut comment sauver une image issue d'un ScrolledText?
    bonjour à vous,
    je veux charger une image, la modifier et la sauver
    je vous soumets l'exemple suivant
    le problème est que je ne peux pas récupérer l'image modifiée à l'écran pour la sauver

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    from tkinter import *
    from turtle import *
     
    fen1= Tk()
     
    def clic(event):
        x= int(x3.get())- 1000/0.98 #les corrections de coordonnées
        y= int(y3.get())- 1000 
        can1.create_oval(x- 5, y-5, x+5, y+5, outline= 'red', width= 2)
     
    x3= StringVar()
    y3= StringVar()
    def mouvement(event):
        x3.set(event.x + int(can1.xview()[0] * xmax * 1.45))
        y3.set(event.y + int(can1.yview()[0] * ymax * 1.9))
     
    lab= Label(fen1, text= 'XCoord:').grid(row= 4, column= 0)
    lab= Label(fen1, text= 'YCoord:').grid(row= 5, column= 0)
     
    entr5= Entry(fen1, textvariable= x3)
    entr6= Entry(fen1, textvariable= y3)
    entr5.grid(row= 4, column= 1)
    entr6.grid(row= 5, column= 1)
     
    def sauver():
        #çà ne marche pas domm!!
        photo.write('toto1.gif', format= 'GIF')
     
    but= Button(fen1, text= 'Sauver', command= sauver).grid\
         (row= 6, column= 0)
    can1= ScrolledCanvas(fen1,\
                width= 800, height= 600, canvwidth=2000, canvheight=2000)
     
    photo= PhotoImage(file= 'kitlogo.gif')
     
    can1.create_image(100, 100, image= photo)
    can1.grid(rowspan= 4, padx= 100, pady= 50)
     
    can1.bind('<Motion>', mouvement)
    can1.bind('<ButtonPress-1>', clic)
     
    xmax= can1.winfo_vrootwidth()
    ymax= can1.winfo_vrootheight()
     
    fen1.mainloop()
    je suis débutant sur Python et plutôt perdu dans la doc

    en vous remerciant par avance, Gigi

  2. #2
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonsoir,

    En fait à ce qu'il parait on ne peut pas directement sauvegarder le contenu d'un Canvas on a en gros 2 choix:
    - sauvegarder un fichier ".ps" via Canvas.postscript que l'on convertira ensuite en image grâce au logiciel GhostScrip
    - faire un double dessin l'un dans le Canvas l'autre dans un fichier image vide issu de la bibliothèque PIL que l'on sauvegardera ensuite sous le format image voulu.

    Pour plus de détails: http://www.developpez.net/forums/d94...partir-canvas/

    @+ et bon code!

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 75

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bonjour à toi,
    avec tes conseils, j'ai avancé dans le projet. Le fichier est sauvé au format postscript, mais je n'ai qu'une partie de l'image. Elle mesure 21 X 27 cm

    J'ai essayé Ghostscript, Ghostview et adobe, dans tous les cas, on n'a qu'une partie de l'image.
    Peut-être des paramètres à ajouter à:
    "monimage= can1.postscript(fontmap= 'fontmap')" ?

    il y a aussi des trucs curieux:
    -pour voir la position du pointeur sur la carte (mouvement), je fais un calcul avec:
    l'event(xy), la position du scroll, et la taille de l'image. Cà marche
    - par contre pour cliquer (clic), je dois ajouter une valeur qui semble liée à la taille de l'image

    j'envoie le code qui n'est pas trop long:
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    """
    On a ici une image dans un ScrolledText
    L'image est plus grande que le widget
    J'ai pas tout compris sur les coordonnées, mais pour pouvoir pointer
    sur des coordonnées correctes, il faut tenir compte
    - de la taille de l'image
    - la position du scroll
    - la position de la souris
     
    çà marche pour les mouvements souris, mais pour les dessins (clic),
    il faut déduire des constantes sur x, y
     
    """
    from tkinter import *
    from turtle import *
     
    fen1= Tk()   
     
    def evalX(X):
        return int((X + can1.xview()[0] * float(photo.width())))
     
    def evalY(Y):
        return int((Y + can1.yview()[0] * float(photo.height())))
     
    def clic(event):
     
        x= int(x3.get())-856 #d'où on sort çà ?????
        y= int(y3.get())-680 # çà doit dépendre de la taille de l'image
        can1.create_oval(x- 5, y-5, x+5, y+5, outline= 'red', width= 2)
        print('XEvt', event.x, 'YEvt:', event.y, 'Xcoord:', x3.get(), 'YCoord:', y3.get())
     
    x1= StringVar()
    y1= StringVar()
    x2= StringVar()
    y2= StringVar()
    x3= StringVar()
    y3= StringVar()
    def mouvement(event):
        x1.set(event.x)
        y1.set(event.y)
        x2.set(can1.xview()[0] * xmax)
        y2.set(can1.yview()[0] * ymax)
        x3.set(evalX(event.x))
        y3.set(evalY(event.y))
     
    lab= Label(fen1, text= 'XEvent:').grid(row= 0, column= 0)
    lab= Label(fen1, text= 'YEvent:').grid(row= 1, column= 0)
    lab= Label(fen1, text= 'XOfs:').grid(row= 2, column= 0)
    lab= Label(fen1, text= 'YOfs:').grid(row= 3, column= 0)
    lab= Label(fen1, text= 'XCoord:').grid(row= 4, column= 0)
    lab= Label(fen1, text= 'YCoord:').grid(row= 5, column= 0)
     
    entr1= Entry(fen1, textvariable= x1)
    entr2= Entry(fen1, textvariable= y1)
    entr3= Entry(fen1, textvariable= x2)
    entr4= Entry(fen1, textvariable= y2)
    entr5= Entry(fen1, textvariable= x3)
    entr6= Entry(fen1, textvariable= y3)
    entr1.grid(row= 0, column= 1)
    entr2.grid(row= 1, column= 1)
    entr3.grid(row= 2, column= 1)
    entr4.grid(row= 3, column= 1)
    entr5.grid(row= 4, column= 1)
    entr6.grid(row= 5, column= 1)
     
    def sauver():
        monimage= can1.postscript(fontmap= 'fontmap')
        f= open('sortie.ps', 'w')
        f.write(monimage)
        f.close()
     
    but= Button(fen1, text= 'Sauver', command= sauver).grid\
         (row= 6, column= 0)
     
    photo= PhotoImage(file= 'Aube8.gif')
     
    can1= ScrolledCanvas(fen1,\
                width= 800, height= 600,\
                canvwidth=photo.width(), canvheight=photo.height())
     
    can1.create_image(0, 0, image= photo)
    can1.grid()
     
    can1.bind('<Motion>', mouvement)
    can1.bind('<ButtonPress-1>', clic)
     
    #info(photo)
    #info(Frame)
    #info(can1.create_image)
    xmax= can1.winfo_vrootwidth()
    ymax= can1.winfo_vrootheight()
    print(xmax, ymax)
    print('Larg:', photo.width(), 'Haut:', photo.height())
     
    fen1.mainloop()
    La bibliothèque PIL demande Python 2 et je ne sais pas si çà marcherait avec la version 3.

    Enfin je te remercie pour m'avoir permis de progresser

    @+ Gigi

  4. #4
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 75

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    P.S.
    après essai, c'est bien la partie visible seule, qui est sauvée

    arff c'est pas de la tarte

    +++++ Gigi

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 75

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    re bonjour,
    ca y est:
    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
     
    def sauver():
        can1.xview_moveto(0.0)
        can1.yview_moveto(0.0)
        i= 'a'
        while 1:
            j= 'a'
            while 1:
                print(can1.xview()[1], can1.yview()[1])
                monimage= can1.postscript(fontmap= 'fontmap')
                nomfic= 'sortie' + i +j + '.ps'
                f= open(nomfic, 'w')
                f.write(monimage)
                f.close()
                j= chr(ord(j) +1)
                if int(can1.xview()[1])== 1:
                    break
                can1.xview_moveto(can1.xview()[1])
     
            i= chr(ord(i) + 1)
            can1.xview_moveto(0.0)
            if int(can1.yview()[1])== 1:
                break
            can1.yview_moveto(can1.yview()[1])
    avec GSView, je passe en JPEG
    reste plus qu'à recoller mes images
    merci à toi et si çà peut faire avancer la science ....


    Heeeuh comment on marque "résolu"?

  6. #6
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonsoir,

    Je cois qu'il y a une autre méthode un peu semblable à ce que tu fais et qui nécessite PIL.
    Il s'agit du module ImageGrab de PIL qui permet de faire des captures d'écran
    alors il te suffit de faire des décallalages de la partie à capturer, de la capturer et d'ensuite recoler le tout dans une nouvelle Image
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import Image,ImageGrab
    ...
     
    img = Image.Image.new('RGB',(larg,haut))
    grab = ImageGrab.grabber((x1,y1,x2,y2))
    img.paste(grab,(xa,ya,xb,yb))
    ...
    img.save(monfichier,monextension)
    @+ et bon codage

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

Discussions similaires

  1. [C# 2.0] Comment sauver une image dans un fichier Xml ?
    Par Louis-Guillaume Morand dans le forum C#
    Réponses: 4
    Dernier message: 08/09/2006, 17h47
  2. Comment mixer du html et une image issue de GD
    Par mego dans le forum Modules
    Réponses: 1
    Dernier message: 24/03/2006, 13h55
  3. [Crystal Reports 9] comment insérer une image dans Détails
    Par VVE dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 22/10/2003, 17h06
  4. Comment copier une image dans le presse papier.
    Par cprogil dans le forum Langage
    Réponses: 7
    Dernier message: 09/09/2003, 15h54
  5. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 20h06

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