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

GTK+ avec Python Discussion :

Enregistrer une image


Sujet :

GTK+ avec Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Enregistrer une image
    Bonjour,

    Je développe en ce moment un soft dont le centre est une GtkDrawingArea, qui affiche divers dessins, lignes, etc... (je ne rentre pas dans les détails)
    J'aimerai savoir comme faire pour enregistrer l'image contenue dans mon widget?
    J'utilise Python, PyGTK et Glade.

    Un extrait du code pour que vous voyiez comment je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    self.drw_Map = self.frm_Main.get_widget("drw_Map")
    self.drw_Map.set_size_request(self.drw_Map_width, self.drw_Map_height)
    self.drw_Map_window = self.drw_Map.window
    self.pangolayout = self.drw_Map.create_pango_layout("")
    self.color_list = ["#FFFFFF", "#FF0000", "#00FF00", "#0000FF"]
    self.colors = {}
    self.gc = {}
    for color in self.color_list:
        self.colors[color] = self.drw_Map.get_colormap().alloc_color(color)
        self.gc[color] = self.drw_Map_window.new_gc(foreground = self.colors[color], line_width = 2)
    self.drw_Map_window.draw_rectangle(self.gc[self.color], 0, x, y, w, h)
    Merci d'avance de toute aide!

    Foaly

  2. #2
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Points : 366
    Points
    366
    Par défaut
    Salut,

    Ton objet "gtk.DrawingArea" contient un attribut "window" de type "gtk.gdk.Window", lui-même enfant de "gtk.gdk.Drawable".

    L'objet "gtk.gdk.Drawable" possède une méthode "get_image()" qui retourne un objet "gtk.gdk.Image". C'est une première solution possible, bien que un "gtk.gdk.Image" soit apparemment assez chiant à manipuler.

    Une deuxième solution plus simple est de passer par un "gtk.gdk.Pixbuf", qui, via sa méthode "get_from_drawable()" appelle le "gtk.gdk.Drawable.get_image()" en interne et convertit directement le résultat en Pixbuf.

    En résumé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # "drawingarea" est ta gtk.DrawingArea
    win = drawingarea.window
    # "win" est de type gtk.gdk.Window
    w, h = win.get_size()
    # on crée le pixbuf :
    pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, w, h)
    pixbuf.get_from_drawable(win, win.get_colormap(), 0, 0, 0, 0, w, h)
    # on enregistre le tout :
    pixbuf.save ("test.png", "png")
    J'ai pas testé, mais ça devrait te guider

    -

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Tout d'abord, merci de ta réponse

    Effectivement j'avais regardé Image, Pixmap, Window... mais aucune méthode de save, j'avais pas vu Pixbuf. Je ne pourrai répondre que Dimanche ou Lundi, je te dirai si ça marche (je peut pas tester là)

    Encore merci de l'aide!

    Foaly

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Cool, ça marche!

    Par contre, il y a un problème : mon image est assez grande, et donc dans un ScrollWindow. Si quelque chose se superpose à l'image pendant l'enregistrement, où que le Scroll cache une partie de l'image, ça apparaitra sur l'image sauvegardée... un peu comme si je faisais une capture d'écran et que je la découpais aux dimensions de l'image.
    J'ai essayé avec les gtk.gdk.Image, mais c'est pareil.

    As-tu une solution?

    Merci

  5. #5
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Points : 366
    Points
    366
    Par défaut
    Là je sais pas...

    Peut-être en faisant un .hide() aux autres widgets le temps de sauver l'image ?

    -

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Ca va être compliqué à mon avis, un serveur X 'de base' ne mémorise pas le contenu des fenêtres uqi n'est pas visible à l'écran. Donc si tu mets qque chose devant, il ne connaît pas ce contenu.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Ok, merci de vos réponses.

    Le server X ne connait ptet pas les parties cachées de mon image, mais théoriquement mon soft, lui, oui? Mon image est bien dans le Pixbuf en entier, car elle est redessinée entièrement quand "l'obstacle" disparait... N'y a t'il pas moyen de sauvegarder ce buffer là, et pas ce qui est transmit à X?

  8. #8
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Points : 366
    Points
    366
    Par défaut
    Salut,

    Essaie de passer par un gtk.gdk.Pixmap (qui est une version "hors-écran" d'un gtk.gdk.Drawable) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Créer le Pixmap à partir du Drawable :
    pixm = gtk.gdk.Pixmap(win, w, h)
    # Obtenir le Pixbuf depuis le Pixmap au lieu du Drawable :
    pixbuf.get_from_drawable(pixm, pixm.get_colormap(), 0, 0, 0, 0, w, h)
    -

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci,

    Voici mon ancien code pour plus de clarté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        def save_png(self, source=None, event=None):
            path = frm_File("save").path
            if path == "":
                return
            if path[-4:] != ".png":
                path += ".png"
            w, h = self.drw_Map_window.get_size()
            pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, w, h)
            pixbuf.get_from_drawable(self.drw_Map_window, self.drw_Map_window.get_colormap(), 0, 0, 0, 0, w, h)
            pixbuf.save(path, "png")
    Donc j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pixbuf.get_from_drawable(self.drw_Map_window, self.drw_Map_window.get_colormap(), 0, 0, 0, 0, w, h)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            # Créer le Pixmap à partir du Drawable :
            pixm = gtk.gdk.Pixmap(self.drw_Map_window, w, h)
            # Obtenir le Pixbuf depuis le Pixmap au lieu du Drawable :
            pixbuf.get_from_drawable(pixm, pixm.get_colormap(), 0, 0, 0, 0, w, h)
    Ce qui me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        def save_png(self, source=None, event=None):
            path = frm_File("save").path
            if path == "":
                return
            if path[-4:] != ".png":
                path += ".png"
            w, h = self.drw_Map_window.get_size()
            pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, w, h)
            # Créer le Pixmap à partir du Drawable :
            pixm = gtk.gdk.Pixmap(self.drw_Map_window, w, h)
            # Obtenir le Pixbuf depuis le Pixmap au lieu du Drawable :
            pixbuf.get_from_drawable(pixm, pixm.get_colormap(), 0, 0, 0, 0, w, h)
            pixbuf.save(path, "png")
    Il n'y a pas d'erreur, mais l'image enregistrée est entièrement noire...
    J'ai beau chercher je vois pas. Je dessine bien sur mon self.drw_Map_window (en fait tout simplement self.drw_Map.window), je le passe en argument pour la création du pixmap, que je transforme en pixbuf pour l'enregistrer. Pourquoi au final l'image est-elle noire?

    Suis-je le seul à trouver que tout ces objets pour gérer les images sont compliqués? Un seul n'aurait-il pas suffit?

  10. #10
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Points : 366
    Points
    366
    Par défaut
    Pffff... là ça me dépasse

    C'est vrai que c'est un peu compliqué, tous ces objets, mais je crois que ça a été fait comme ça pour être le plus proche possible du fonctionnement des serveurs graphiques.

    -

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Ok c'est pas grave, je vais continuer de chercher.
    Je vous tiens au courant si je trouve une solution, d'ici là merci de l'aide que vous m'avez apporté!

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    Bonjour,

    Enregistrer une image m'intéresse, avez-vous trouvé une solution ?

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    Bonjour,

    J'ai trouvé une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	def save(self, path, type):		
    		win = self.window
    		w, h = win.get_size()
     
    		pixm = self.get_snapshot(None)
    		pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, w, h)
    		pixbuf.get_from_drawable(pixm, pixm.get_colormap(), 0, 0, 0, 0, w, h)
     
    		pixbuf.save (path, type)
    Cette méthode s'applique sur un objet DrawingArea.

    En espérant que ça dépanne quelqu'un..

  14. #14
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Points : 30
    Points
    30
    Par défaut
    Je suis actuellement dans le même cas, un graph dessiné dans une drawing area, avec des scroll bar pour naviguer, et je souhaiterai pouvoir faire une image du graph au début lors du calcul pour ensuite pouvoir scroller sur celle-ci au lieu de tout recalculer à chaque scroll.

    Merci !

Discussions similaires

  1. ENREGISTRER UNE IMAGE OU UN FICHIER .DOC
    Par manudja dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/08/2005, 13h32
  2. enregistrer une image
    Par meli0207 dans le forum MFC
    Réponses: 35
    Dernier message: 12/07/2005, 09h00
  3. [GLScene] Comment enregistrer une image au format TGA
    Par Invité dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 27/05/2005, 15h12
  4. Enregistrer une image
    Par N@sH dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 04/05/2005, 10h07
  5. enregistrer une image et un identifiant
    Par dosach dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/03/2004, 17h18

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