Преобразование изображения PIL в GTK Pixbuf - PullRequest
11 голосов
/ 26 октября 2011

Я смотрю, есть ли другой способ конвертировать изображение 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 

Есть ли какой-нибудь более простой способ сделать это преобразование, которое я пропустил?

Ответы [ 3 ]

10 голосов
/ 26 октября 2011

Вы можете сделать это эффективно, если перейдете через массив numpy:

import numpy
arr = numpy.array(im)
return gtk.gdk.pixbuf_new_from_array(arr, gtk.gdk.COLORSPACE_RGB, 8)
8 голосов
/ 17 января 2012

Если вы используете 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)
2 голосов
/ 30 января 2015

Я не могу использовать 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
...