我在Python 3中有一些RGBA数据,我想在一个GTK3窗口中显示它所代表的图像而不使用任何额外的库。
我尝试过的第一件事是编辑一个Pixbuf
的数据,就像(C)文档中的例子(http://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-The-GdkPixbuf-Structure.html#put-pixel - 抱歉,我只被允许2个链接),使用Pixbuf.get_pixels()
。然而,这给了我一个不可变的bytes
对象,显然行不通。(gdk-pixbuf的一个错误报告(668084),如果SO能让我链接到它,我会链接到它的。)虽然功能有所改变。
接下来,我尝试使用Pixbuf.new_from_data()
从数据创建Pixbuf,但这也存在问题(参见gdk-pixbuf bug 674691) (没错,在评论3中就是我)。
然后我看了看Cairo:ImageSurface.create_for_data
应该可以做到这一点,但由于某种原因,Python 3绑定目前还没有这个功能。(我已经尝试过使用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()
编辑:实际上,为了正确性,在大端系统上添加到头文件之前,我认为这将需要一个 pixels.byteswap()
(虽然当然在这些颜色中无关紧要)。
Pixbuf
,只有数据 - 这就是问题所在。(如果我有的话,我会像我之前提到的那样使用gtk.Image
)。 - ikn