PyCairo, PIL and StringIO

Fredrik Lundh fredrik at pythonware.com
Wed Jan 2 09:39:11 EST 2008


Jair Trejo wrote:

> I'm doing some image processing in PIL, and I want to
> display the results in a GTK window using PyCairo, so
> I create a Cairo image surface from the PIL Image like
> this:
> data
>         mfile = StringIO.StringIO()
>         final.save(mfile, format="PNG")
>         ima =
> cairo.ImageSurface.create_from_png(mfile)
>         mfile.close()
>         return ima
> 
> Where final is a PIL image. The problem is, I get a
> IOError: error while reading from Input Stream.
> 
> ¿Any idea of why is this happening?

"save" leaves the file pointer at an undefined position (usually at the 
end), so my guess is that you have to rewind the file before you pass it
to the next function:

     final.save(mfile, format="PNG")
     mfile.seek(0) # rewind

also note that compressing and decompressing will introduce unnecessary 
overhead; chances are that you might get a lot better performance if you 
just shuffle the raw pixels.  I haven't used PyCairo myself, but from a 
quick look at the ImageSurface documentation, something like this should 
work (untested):

    if final.mode != "RGB":
        final = final.convert("RGB")
    w, h = final.size
    data = final.tostring() # get packed RGB buffer
    ima = cairo.ImageSurface.create(data, FORMAT_RGB24, w, h, w*3)

(tweak as necessary)

</F>




More information about the Python-list mailing list