将PIL图像转换为GTK Pixbuf

bsk*_*1ch 11 python gtk image-processing python-imaging-library

我想看看是否有另一种方法将PIL图像转换为GTK Pixbuf.现在,我所拥有的只是看起来像我发现的低效编码实践,并且已经破解了我的需求.这是我到目前为止:

def image2pixbuf(self,im):  
    file1 = StringIO.StringIO()  
    im.save(file1, "ppm")  
    contents = file1.getvalue()  
    file1.close()  
    loader = gtk.gdk.PixbufLoader("pnm")  
    loader.write(contents, len(contents))  
    pixbuf = loader.get_pixbuf()  
    loader.close()  
    return pixbuf 
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来完成我错过的转换?

max*_*axy 10

如果你通过一个numpy数组,你可以有效地做到这一点:

import numpy
arr = numpy.array(im)
return gtk.gdk.pixbuf_new_from_array(arr, gtk.gdk.COLORSPACE_RGB, 8)
Run Code Online (Sandbox Code Playgroud)

  • 从PyGtk迁移到PyGI后,返回行应该是:'返回GdkPixbuf.Pixbuf.new_from_data(arr,GdkPixbuf.Colorspace.RGB,False,8,arr.shape [1],arr.shape [0],arr .shape [1]*3)' (10认同)

Dav*_*lla 8

如果你正在使用PyGI和GTK + 3,这里有一个替代方案,它也不需要依赖numpy:

import array
from gi.repository import GdkPixbuf

def image2pixbuf(self,im):
    arr = array.array('B', im.tostring())
    width, height = im.size
    return GdkPixbuf.Pixbuf.new_from_data(arr, GdkPixbuf.Colorspace.RGB,
                                          True, 8, width, height, width * 4)
Run Code Online (Sandbox Code Playgroud)

  • new_from_data()无法正确管理内存,最近添加了new_from_bytes(),将在3.14(https://bugzilla.gnome.org/show_bug.cgi?id=732297)中提供.另见:http://stackoverflow.com/questions/24062779/how-to-correctly-covert-3d-array-into-continguous-rgb-bytes/24070152#24070152 (6认同)