Convertir PIL GdkPixbuf

¿Cómo puedo convertir la imagen PIL en pixbuf ?. Intenté cambiar muchos ejemplos pero no hay solución.

import array from gi.repository import GdkPixbuf def image2pixbuf(self,im): arr = array.array('B', im.tostring()) height, width = im.size return GdkPixbuf.Pixbuf.new_from_data(arr, GdkPixbuf.Colorspace.RGB, True, 8, width, height, width * 4) 

Error

 TypeError: new_from_data () takes Exactly 9 arguments (7 given) 

Yo uso Pygobject https://live.gnome.org/PyGObject

Usted está pasando menos argumentos que los requeridos por el método new_from_data. Siempre puede consultar la documentación de C para los argumentos .

He encontrado el mismo problema con Gtk3. GdkPixbuf.PixbufDestroyNotify – NotImplementedError – python gtk3

Parece que hay un error. Lo he denunciado. https://bugzilla.gnome.org/show_bug.cgi?id=674691

Gtk3 tiene este error. Pero todavía puedes hacerlo en Gtk2.

Así es como lo hice en PyGtk, quizás esto todavía funciona (estoy copiando el código después de que Pygi-convert’ed it):

 import Image import StringIO from gi.repository import GdkPixbuf def thumbnail_image(self, image): """Creates a thumbnail GdkPixbuf of given image""" # Create thumbnail img = Image.open(image) img.thumbnail((200, 300), Image.ANTIALIAS) # Convert to GdkPixbuf if img.mode != 'RGB': # Fix IOError: cannot write mode P as PPM img = img.convert('RGB') buff = StringIO.StringIO() img.save(buff, 'ppm') contents = buff.getvalue() buff.close() loader = GdkPixbuf.PixbufLoader('pnm') loader.write(contents, len(contents)) pixbuf = loader.get_pixbuf() loader.close() return pixbuf 

Saludos cordiales


EDIT: Ok, esto parece estar funcionando … Odio la API mal portada de PyGObject (hasta ahora …).

Código ( test.py ):

 import Image import StringIO from gi.repository import Gtk, GdkPixbuf from os.path import abspath, dirname, join WHERE_AM_I = abspath(dirname(__file__)) class MyApp(object): def __init__(self): # Build GUI self.builder = Gtk.Builder() self.glade_file = join(WHERE_AM_I, 'test.glade') self.builder.add_from_file(self.glade_file) # Get objects go = self.builder.get_object self.window = go('window') self.image = go('image') # Load image path = join(WHERE_AM_I, 'logo.png') thumbnail = self.thumbnail_image(path) self.image.set_from_pixbuf(thumbnail) # Connect signals self.builder.connect_signals(self) # Everything is ready self.window.show() def main_quit(self, widget): Gtk.main_quit() def thumbnail_image(self, image): """Creates a thumbnail GdkPixbuf of given image""" # Create thumbnail img = Image.open(image) img.thumbnail((200, 300), Image.ANTIALIAS) # Convert to GdkPixbuf if img.mode != 'RGB': # Fix IOError: cannot write mode P as PPM img = img.convert('RGB') buff = StringIO.StringIO() img.save(buff, 'ppm') contents = buff.getvalue() buff.close() loader = GdkPixbuf.PixbufLoader.new_with_type('pnm') loader.write(contents) pixbuf = loader.get_pixbuf() loader.close() return pixbuf if __name__ == '__main__': gui = MyApp() Gtk.main() 

Archivo Glade ( test.glade ):

     False center-always 300 200    True False     

Lo que parece:

Resultado de convertir la imagen PIL a GdkPixbuf

(Las mejoras para agregar soporte de canal alfa son bienvenidas)

Saludos cordiales