10

How can I save a pixmap as a .png file?
I do this:

    image = gtk.Image()
    image.set_from_pixmap(disp.pixmap, disp.mask)
    pixbf=image.get_pixbuf()
    pixbf.save('path.png')

I get this error:

    pixbf=image.get_pixbuf()
    ValueError: image should be a GdkPixbuf or empty
Bhargav Rao
  • 50,140
  • 28
  • 121
  • 140
Hesam
  • 105
  • 6

3 Answers3

10

From the documentation,

The get_pixbuf() method gets the gtk.gdk.Pixbuf being displayed by the gtk.Image. The return value may be None if no image data is set. If the storage type of the image is not either gtk.IMAGE_EMPTY or gtk.IMAGE_PIXBUF the ValueError exception will be raised.

(Emphasis Mine)

As you need a png file, You can follow the instructions from here

pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,has_alpha=False, bits_per_sample=8, width=width, height=height)
pixbuf.get_from_drawable(disp.pixmap, disp.pixmap.get_colormap(), 0, 0, 0, 0, width, height)
pixbuf.save('path.png')

This will create a pixbuf from your pixmap which is disp.pixmap. This can be later saved using pixbuf.save

Bhargav Rao
  • 50,140
  • 28
  • 121
  • 140
4

In these cases it is useful to read the documentation from Gtk itself, instead of the PyGtk, as they are more complete.

In this case the relevant functions are gtk_image_set_from_pixmap() and gtk_image_get_pixbuf():

Gets the GdkPixbuf being displayed by the GtkImage. The storage type of the image must be GTK_IMAGE_EMPTY or GTK_IMAGE_PIXBUF.

The problem is that the GtkImage widget can hold both a GdkPixbuf, a GdkPixmap, a GdkImage... but it cannot convert between them, that is, you can only recover what you stored.

You are storing a pixmap and trying to get a pixbuf, and that will not work. Now, what is the solution? That depends on what you are trying to do exactly. Probably it is enough if you convert it to a pixbuf with gtk.pixbuf.get_from_drawable():

w,h = disp.pixmap.get_size()
pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, w, h)
pb.get_from_drawable(disp.pixmap, disp.pixmap.get_colormap(),
    0, 0, 0, 0, width, height)
pb.save('path.png')
rodrigo
  • 94,151
  • 12
  • 143
  • 190
3

While waiting for the answer I actually found the solution

pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, width, height)
pixbf = pixbuf.get_from_drawable(disp.pixmap, disp.pixmap.get_colormap(), 0, 0, 0, 0, width, height)
pixbf.save('path.png')

assuming disp.pixmap is your pixmap object

Tadej Magajna
  • 2,765
  • 1
  • 25
  • 41