2012-04-26 7 views
5

Jak przekonwertować obraz PIL w pixbuf ?. Próbowałem zmienić wiele przykładów, ale nie rozwiązanieKonwersja 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) 

Błąd

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

używam Pygobject https://live.gnome.org/PyGObject

Odpowiedz

1

Napotkałem ten sam problem z Gtk3. GdkPixbuf.PixbufDestroyNotify - NotImplementedError - python gtk3

Wygląda na to, że istnieje błąd. Zgłosiłem to. https://bugzilla.gnome.org/show_bug.cgi?id=674691

Gtk3 ma ten błąd. Ale nadal możesz to zrobić w Gtk2.

+0

ten komentarz z raportu o błędzie może być przydatna: „tak można nadal używać' new_from_file() ', lub po prostu' new() ' i ustaw dane później " –

+1

Tak, widziałem to. Ale chcę konkretnie gdkPixbuf new_from_data() – Froyo

1

To jak to zrobiłem w pygtk, może to nadal działa (mam kopiując kod po pygi-convert'ed go):

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 

poważaniem


EDIT : Ok, to wydaje się działać ... Po prostu nienawidzę PyGObject słabego API C portowanego (do tej pory ...).

Code (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() 

plik Polana (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> 

wygląda Co jak:

Result of converting PIL Image to GdkPixbuf

(Ulepszenia dodać wsparcie kanału alfa są mile widziane)

poważaniem