我在Python 3中有一些RGBA数据,我想在GTK3窗口中显示它表示的图像,而不使用任何额外的库。

我尝试做的第一件事是编辑Pixbuf的数据,例如在示例中(http://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-The-GdkPixbuf-Structure.html#put-pixel-对不起,我只允许(C)文档中的2个链接,使用Pixbuf.get_pixels()。但是,这给了我一个不变的bytes对象,因此显然不起作用。 (gdk-pixbuf错误报告(668084,如果SO让我可以链接到该报告)涵盖了相同的功能,但此后必须做一些改动。)

接下来,我尝试使用 Pixbuf.new_from_data() 从数据创建一个Pixbuf,但这也是有问题的(请参阅gdk-pixbuf错误674691)(是的,在评论3中就是我)。

然后我看了开罗: ImageSurface.create_for_data 应该这样做,但是由于某些原因,在Python 3绑定(bind)中尚不可用。 (我已经使用Python 2进行了尝试,然后将表面转换为Pixbuf,然后将其包装在gtk.Image中,并且可以使用。但是我使用的是Python3(即使那样,也很杂乱-Cairo是一个矢量图形库,之后全部))。

我在某处找到了使用PIL将图像写到PNG文件然后将其读入Pixbuf的引用,但这太可怕了,使用了一个额外的库,而且PIL仍然不适用于Python 3。

那么...还有其他方法吗?

工作代码

根据Havok的回答,这是一个有效的示例:

from array import array

from gi.repository import Gtk as gtk, GdkPixbuf

pixels = array('H')
for i in range(20):
    for j in range(20):
        px = (i < 10, j >= 10, (i < 10) ^ (j < 10))
        pixels.extend(65535 * c for c in px)

header = b'P6 20 20 65535 '
img_data = header + pixels

w = gtk.Window()
w.connect('delete-event', gtk.main_quit)
l = GdkPixbuf.PixbufLoader.new_with_type('pnm')
l.write(img_data)
w.add(gtk.Image.new_from_pixbuf(l.get_pixbuf()))
l.close()
w.show_all()
gtk.main()

编辑:实际上,为了正确起见,我认为在添加到 header 之前,这需要在小端系统上使用pixels.byteswap()(尽管这些颜色当然无关紧要)。

最佳答案

哇,这将是一个艰难的过程,非常艰难。

PIL或Cairo的ImageSurface.create_from_data()均不适用于Python3。剩下的唯一选择是直接使用GdkPixbuf,但是正如您所说的,这不是一个完美的解决方案,特别是因为您希望使用alpha channel 。我唯一的想法是您尝试使用此方法:

http://developer.gnome.org/gdk-pixbuf/stable/GdkPixbufLoader.html#gdk-pixbuf-loader-new-with-type

就像我在这里结尾处所做的:Converting PIL GdkPixbuf

loader = GdkPixbuf.PixbufLoader.new_with_type('pnm')
loader.write(contents)
pixbuf = loader.get_pixbuf()
loader.close()

并尝试查看支持哪些类型,找不到C文档关于gdk_pixbuf_format_get_name()gdk_pixbuf_get_formats()所说的PyGObject版本。使用pnm format,您将没有alpha channel 。

编辑

很好,您找到了PyGObject函数,在此处出于文档目的发布了输出:
>>> from gi.repository import GdkPixbuf
>>> formats = GdkPixbuf.Pixbuf.get_formats()
>>> [f.get_name() for f in formats]
['GdkPixdata', 'ras', 'tiff', 'wmf', 'icns', 'ico', 'png', 'qtif',
 'wbmp', 'gif', 'pnm', 'tga', 'ani', 'xbm', 'xpm', 'jpeg2000',
 'pcx', 'jpeg', 'bmp', 'svg']

关于python - 使用Pygobject和Python 3从内存中数据显示图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12413645/

10-10 19:11