首页 > 解决方案 > python GTK3图像来自PIL jpg格式

问题描述

我试图从缓冲区打开图像(jpg)(从 Oracle 数据库中获取 blob)作为 Gtk.Image() 并将其添加到 Gtk 窗口,但我收到错误“预期 Gtk.Widget,但得到 PIL.JpegImagePlugin .JpegImage 文件”。我可以用 show() 显示图像,我可以 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("path with jpg extension") 的结果添加到 newwindow 但不知道如何执行此操作:

newwindow.add(dt) 

或任何具有类似效果的东西。如何以最简单的方式做到这一点?

标签: pythonpython-3.xpython-imaging-librarygtk3

解决方案


对我有用的是-

从缓冲区加载 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()

推荐阅读