我正在尝试从缓冲区(从Oracle数据库获取blob)作为Gtk.Image()打开图像(jpg),并将其添加到Gtk窗口,但是出现错误“ Expected Gtk.Widget,但是PIL.JpegImagePlugin.JpegImageFile”。我可以用show()显示图像,也可以从光盘上的path窗口添加window.add jpeg文件,然后显示窗口,但是当我尝试从缓冲区添加jpg时出现错误。这是我制作的:
my_source=Here_I_get_BLOB_img_from_database()
newimage=Gtk.Image()
newimage=my_source.read()
image=io.BytesIO(newimage)
dt=Image.open(image)
newwindow = Gtk.Window(modal=True)
在这一点上,实际上我在缓冲区中有jpg,我可以这样做:
dt.show() # to display the image in system imageviewer
或者将dt另存为jpg,或者将image.set_from_file(“具有jpg扩展名的路径”)的结果添加到新窗口中,但不知道如何执行此操作:
newwindow.add(dt)
或具有类似效果的任何东西。如何以最简单的方式做到这一点?
答案 0 :(得分:1)
对我有用的是-
从缓冲区加载img的Gtk.Image具有Pixbuf对象,例如可以从流中加载。所以:
from gi.repository import (...) GdkPixbuf, GLib, Gio
(...)
my_source=Here_I_get_BLOB_img_from_database()
newimage=my_source.read()
glib=GLib.Bytes.new(newimage)
stream = Gio.MemoryInputStream.new_from_bytes(glib)
pixbuf = GdkPixbuf.Pixbuf.new_from_stream(stream, None)
image=Gtk.Image().new_from_pixbuf(pixbuf)
my_window = Gtk.Window(modal=True, title="Image")
my_window.add(image)
image.show()
my_window.show()