我在 Python 3 中有一些 RGBA 数据,我想在 GTK3 窗口中显示它所代表的图像,而不使用任何额外的库。
我尝试的第一件事是编辑 aPixbuf
的数据,例如(http://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-The-GdkPixbuf-Structure.html#put-pixel - 抱歉,我'm only allowed 2 links) in the (C) documentation, using Pixbuf.get_pixels()
. 但是,这给了我一个不可变的bytes
对象,因此显然行不通。(一个 gdk-pixbuf 错误报告(668084,如果允许我会链接到它)涵盖了相同的功能,但从那以后东西必须有所改变。)
接下来,我尝试使用从数据创建 Pixbuf Pixbuf.new_from_data()
,但这也有问题(请参阅 gdk-pixbuf 错误 674691)(是的,这就是我在评论 3 中)。
然后我查看了 Cairo: ImageSurface.create_for_data
should do this,但由于某种原因,这在 Python 3 绑定中尚不可用。(我已经用 Python 2 尝试过,然后将表面变成 a Pixbuf
,然后将其包装在 agtk.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()
小端系统(尽管这些颜色当然无关紧要)。