Преобразование PIL GdkPixbuf

Как я могу преобразовать изображение PIL в pixbuf?. Я пытался изменить много примеров, но не нашел решения

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


person Plaoo    schedule 26.04.2012    source источник


Ответы (2)


Я столкнулся с той же проблемой с Gtk3. GdkPixbuf.PixbufDestroyNotify - NotImplementedError - python gtk3

Кажется, есть ошибка. Я сообщил об этом. https://bugzilla.gnome.org/show_bug.cgi?id=674691

Gtk3 имеет эту ошибку. Но вы все еще можете сделать это в Gtk2.

person Froyo    schedule 06.05.2012
comment
Этот комментарий из отчета об ошибке может быть полезен: так что вы все еще можете использовать new_from_file() или просто new() и установить данные позже - person David Planella; 16.05.2012
comment
Да, я видел это. Но я специально хочу gdkPixbuf new_from_data() - person Froyo; 17.05.2012

Вот как я сделал это в PyGtk, возможно, это все еще работает (я копирую код после его преобразования в pygi):

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 плохой портированный API C (до сих пор...).

Код (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>

На что это похоже:

Результат преобразования изображения PIL в GdkPixbuf

(Улучшения для добавления поддержки альфа-канала приветствуются)

С уважением

person Havok    schedule 11.05.2012