10

如何将像素图保存为 .png 文件?
我这样做:

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

我收到此错误:

    pixbf=image.get_pixbuf()
    ValueError: image should be a GdkPixbuf or empty
4

3 回答 3

10

文档中,

get_pixbuf()方法获取gtk.gdk.Pixbuf正在显示的gtk.Image. 如果没有设置图像数据,则该return值可能是。None如果图像的存储类型不是, gtk.IMAGE_EMPTY否则gtk.IMAGE_PIXBUF将引发ValueError 异常

(强调我的)

由于您需要png文件,您可以按照此处的说明进行操作

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')

pixbuf这将从您的pixmapwhich is创建一个disp.pixmap。这可以稍后保存使用pixbuf.save

于 2015-05-02T19:33:05.440 回答
4

在这些情况下,从 Gtk 本身而不是 PyGtk 中阅读文档会很有用,因为它们更完整。

在这种情况下,相关函数是gtk_image_set_from_pixmap()gtk_image_get_pixbuf()

获取 GtkImage 正在显示的 GdkPixbuf。图片的存储类型必须为 GTK_IMAGE_EMPTY 或 GTK_IMAGE_PIXBUF。

问题是GtkImage小部件可以同时保存 a GdkPixbuf, a GdkPixmap, a GdkImage... 但它不能在它们之间转换,也就是说,您只能恢复您存储的内容。

您正在存储一个像素图并尝试获取一个像素缓冲区,但这是行不通的。现在,解决方案是什么?这取决于你想要做什么。如果您使用gtk.pixbuf.get_from_drawable()将其转换为 pixbuf 可能就足够了:

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')
于 2015-05-02T19:35:40.670 回答
3

在等待答案时,我实际上找到了解决方案

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')

假设 disp.pixmap 是您的像素图对象

于 2015-05-02T19:29:08.413 回答