2012-04-26 41 views
5

如何在pixbuf中轉換PIL圖像?我試圖改變的例子很多,但沒有解決轉換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) 

錯誤

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

我用Pygobject https://live.gnome.org/PyGObject

回答

1

我遇到了與Gtk3相同的問題。 GdkPixbuf.PixbufDestroyNotify - NotImplementedError - python gtk3

看來有一個bug。我已經報道過。 https://bugzilla.gnome.org/show_bug.cgi?id=674691

Gtk3有這個錯誤。但是你仍然可以在Gtk2中做到這一點。

+0

這一評論來自bug報告可能是有用的:「這樣你就可以 仍然使用'new_from_file()',或者只是'新的()'並在稍後設置數據「 – 2012-05-16 18:09:22

+1

是的,我看到了。但我特別想要gdkPixbuf new_from_data() – Froyo 2012-05-16 21:01:03

1

這是我如何PyGTK的做到了,也許這仍然有效(我複製後的代碼pygi-convert'ed吧):

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 

親切的問候


編輯:好吧,這似乎正在工作......我只是很討厭PyGObject的C端口API(直到現在...)。

代碼(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() 

格萊德文件(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> 

它看起來像什麼:

Result of converting PIL Image to GdkPixbuf

(改進添加Alpha通道支持,歡迎)

親切的問候