2012-04-26 14 views
5

¿Cómo puedo convertir la imagen de PIL en pixbuf ?. He intentado cambiar muchos ejemplos, pero hay una soluciónConversión de PIL GdkPixbuf

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) 

utilizo PyGObject https://live.gnome.org/PyGObject

Respuesta

1

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

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

Gtk3 tiene este error. Pero aún puedes hacerlo en Gtk2.

+0

Este comentario del informe de error podría ser útil: "para que pueda todavía usar' new_from_file() ', o simplemente' nueva() ' y establecer los datos más tarde " –

+1

Sí, lo vi. Pero específicamente quiero gdkPixbuf new_from_data() – Froyo

1

Esta es la forma en que lo hice en PyGtk, tal vez esto todavía funciona (estoy copiando el código después de pygi-convert'ed ella):

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


EDITAR : Ok, esto parece estar funcionando ... Odio PyGObject pobremente portado API (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 de Glade (test.glade):

<?xml version="1.0" encoding="UTF-8"?> 
<interface> 
    <!-- interface-requires gtk+ 3.0 --> 
    <object class="GtkWindow" id="window"> 
    <property name="can_focus">False</property> 
    <property name="window_position">center-always</property> 
    <property name="default_width">300</property> 
    <property name="default_height">200</property> 
    <signal name="destroy" handler="main_quit" swapped="no"/> 
    <child> 
     <object class="GtkImage" id="image"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     </object> 
    </child> 
    </object> 
</interface> 

Lo que parece:

Result of converting PIL Image to GdkPixbuf

(Mejoras para añadir soporte para canales alfa son bienvenidos)

Saludos cordiales