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