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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    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 chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    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 chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    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 Expert
    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
    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.

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