ValueError при попытке сохранить pixmap в виде файла png

Как сохранить pixmap как файл .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

Ответ 1

Из документации,

Метод 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 из вашего pixmap, который disp.pixmap. Это может быть позже сохранено с помощью pixbuf.save

Ответ 2

В этих случаях полезно прочитать документацию непосредственно из Gtk, а не PyGtk, поскольку они более полные.

В этом случае соответствующие функции gtk_image_set_from_pixmap() и gtk_image_get_pixbuf():

Получает GdkPixbuf, отображаемый GtkImage. Тип хранилища изображения должен быть GTK_IMAGE_EMPTY или GTK_IMAGE_PIXBUF.

Проблема в том, что виджет GtkImage может содержать как GdkPixbuf, a GdkPixmap, a GdkImage... но он не может конвертировать между ними, то есть вы можете восстановить только то, что вы сохранили.

Вы сохраняете pixmap и пытаетесь получить pixbuf, и это не сработает. Теперь, каково решение? Это зависит от того, что вы пытаетесь сделать точно. Вероятно, этого достаточно, если вы преобразуете его в pixbuf с 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')

Ответ 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 является вашим объектом pixmap