2012-04-26 10 views
5

मैं पीआईएल छवि को पिक्सबफ में कैसे परिवर्तित कर सकता हूं? मैं कई उदाहरण बदलने की कोशिश की, लेकिन कोई समाधान नहींपीआईएल कनवर्ट करना 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

ऐसा लगता है कि एक बग है। मैंने इसकी सूचना दी है। https://bugzilla.gnome.org/show_bug.cgi?id=674691

Gtk3 में यह बग है। लेकिन आप अभी भी इसे जीटीके 2 में कर सकते हैं।

+0

यह टिप्पणी उपयोगी हो सकता है: "तो तुम अभी भी' new_from_file() का उपयोग कर सकते ', या बस' नई() ' और बाद में डेटा सेट करें " –

+1

हाँ मैंने देखा। लेकिन मैं विशेष रूप से gdkPixbuf new_from_data() चाहता हूँ – Froyo

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 

तरह का संबंध


संपादित करें : ठीक है, ऐसा लगता है कि काम कर रहा है ... मैं बस इतना ही पीजीओजीजेक्ट गरीब सी पोर्ट एपीआई से नफरत करता हूं (अब तक ...)।

संहिता (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() 

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> 

यह कैसा दिखता है:

Result of converting PIL Image to GdkPixbuf

(सुधार जोड़ने के लिए अल्फा चैनल समर्थन का स्वागत है)

तरह बग रिपोर्ट से संबंध