2011-10-26 23 views
10

PIL Görüntüsünü GTK Pixbuf'a dönüştürmenin başka bir yolu olup olmadığını görmek istiyorum. Şu an sahip olduğum şey, ihtiyaçlarımı bulup hacklediğim verimsiz kodlama uygulaması gibi görünüyor. Kaçırdığım bu dönüşümü yapmak için kolay bir yoluPIL Görüntüsünü GTK'ye Dönüştürme 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 

var mı: Bu defa ne var?

cevap

9

bir numpy dizide aracılığıyla giderseniz verimli bir şekilde yapabilirsiniz:

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

, dönüş hattı muhtemelen olmalıdır: 'arr (GdkPixbuf GdkPixbuf.Pixbuf.new_from_data dönmek .Colorspace.RGB, False, 8, arr.shape [1], arr.shape [0], arr.shape [1] * 3) ' –

6

Eğer pygi ve GTK + 3 kullanıyorsanız, burada da Numpy bir bağımlılık ihtiyacını ortadan kaldıran bir alternatiftir:

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) 
+0

Maalesef şu an çalışmıyor gibi görünüyor, bkz. Http: // stackoverflow.com/questions/7906814/converting -pil-image-to-gtk-pixbuf – Havok

+0

Daha spesifik olabilir misiniz? Tam olarak hangi kısım çalışmıyor? Ayrıca bağlantınız, bu geçerli soruya stackoverflow'ta işaret ediyor. Belki başka birine işaret etmeyi mi düşünüyorsun? –

+0

Üzgünüm, yanlış bağlantıyı yapıştırdım: http://stackoverflow.com/questions/10341988/converting-pil-gdkpixbuf/ – Havok

2

Ben Çalıştırmak için [1], bu nedenle bu sırayla seninki gibi workaroud yaptılar (bu sürüm new_from_bytes yöntemi vardır) gTK 3.14 kullanabilmek için değilim:

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 

Referanslar: pygi için PyGtk göçün ardından

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