ikn*_*ikn 9 python pygobject python-3.x gtk3
我在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 Pixbuf.new_from_data(),但这也是错误的(参见gdk-pixbuf bug 674691)(是的,那是评论3中的我).
然后我看了一下Cairo:ImageSurface.create_for_data应该这样做,但由于某种原因,这在Python 3绑定中还没有.(我已经尝试过使用Python 2,然后将表面转换为a 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()
Run Code Online (Sandbox Code Playgroud)
编辑:实际上,为了正确起见,我认为pixels.byteswap()在添加到标题之前需要一个小端系统(当然这与这些颜色无关).
哇,这将是一个艰难的,非常难.
PIL或Cairo的ImageSurface.create_from_data()都不适用于Python 3.您唯一的选择是直接使用GdkPixbuf,但正如您所说,这不是一个完美的解决方案,特别是因为您希望使用alpha通道.我唯一的想法是你尝试使用它:
http://developer.gnome.org/gdk-pixbuf/stable/GdkPixbufLoader.html#gdk-pixbuf-loader-new-with-type
正如我在这里结束时所做的那样:转换PIL GdkPixbuf
loader = GdkPixbuf.PixbufLoader.new_with_type('pnm')
loader.write(contents)
pixbuf = loader.get_pixbuf()
loader.close()
Run Code Online (Sandbox Code Playgroud)
并尝试看看支持什么类型的,也找不到什么C文档中说,有关的PyGObject版本gdk_pixbuf_format_get_name()和gdk_pixbuf_get_formats().使用pnm格式,您将没有alpha通道.
编辑
很棒,你找到了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']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2855 次 |
| 最近记录: |