将 PIL 图像转换为 GTK Pixbuf

发布于 2024-12-11 23:12:33 字数 456 浏览 0 评论 0原文

我想看看是否有另一种方法可以将 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 

是否有一些更简单的方法来完成我错过的转换?

I am looking to see if there is another way to convert a PIL Image to GTK Pixbuf.
Right now all I have is what seems to be like inefficient coding practice that I found and hacked to my needs. This is what I have so far:

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 

Is there some easier way to do this conversion that I missed?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

如梦初醒的夏天 2024-12-18 23:12:34

如果你使用 numpy 数组,你可以有效地做到这一点:

import numpy
arr = numpy.array(im)
return gtk.gdk.pixbuf_new_from_array(arr, gtk.gdk.COLORSPACE_RGB, 8)

You can do it efficiently if you go via a numpy array:

import numpy
arr = numpy.array(im)
return gtk.gdk.pixbuf_new_from_array(arr, gtk.gdk.COLORSPACE_RGB, 8)
若有似无的小暗淡 2024-12-18 23:12:34

如果您使用 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)

If you're using PyGI and GTK+3, here's an alternative which also removes the need for a dependency on 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)
魄砕の薆 2024-12-18 23:12:34

我无法使用 gtk 3.14(此版本具有方法 new_from_bytes)[1],因此,为了使其正常工作,请按照您的方法进行此解决方法:

from gi.repository import GdkPixbuf
import cv2

def image2pixbuf(im): 
  # convert image from BRG to RGB (pnm uses RGB)
  im2 = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
  # get image dimensions (depth is not used)
  height, width, depth = im2.shape
  pixl = GdkPixbuf.PixbufLoader.new_with_type('pnm')
  # P6 is the magic number of PNM format, 
  # and 255 is the max color allowed, see [2]
  pixl.write("P6 %d %d 255 " % (width, height) + im2.tostring())
  pix = pixl.get_pixbuf()
  pixl.close()
  return pix

参考文献:

  1. https://bugzilla.gnome.org/show_bug.cgi?id=732297
  2. http://en.wikipedia.org/wiki/Netpbm_format

I'm not able to use gtk 3.14 (this version has the method new_from_bytes) [1], so did this workaroud like yours in order to get it working:

from gi.repository import GdkPixbuf
import cv2

def image2pixbuf(im): 
  # convert image from BRG to RGB (pnm uses RGB)
  im2 = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
  # get image dimensions (depth is not used)
  height, width, depth = im2.shape
  pixl = GdkPixbuf.PixbufLoader.new_with_type('pnm')
  # P6 is the magic number of PNM format, 
  # and 255 is the max color allowed, see [2]
  pixl.write("P6 %d %d 255 " % (width, height) + im2.tostring())
  pix = pixl.get_pixbuf()
  pixl.close()
  return pix

References:

  1. https://bugzilla.gnome.org/show_bug.cgi?id=732297
  2. http://en.wikipedia.org/wiki/Netpbm_format
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文