Convert pyBarcode output to PIL Image file

python, python-imaging-library

Solution

`StringIO` objects are file objects.

However, if you are using the `cStringIO` module (the C-optimized version of the `StringIO` module) then do note that once you ceate an empty`StringIO` instance, it is optimized for writing only, and you cannot use it as in input file, and vice-versa. Simply reinitialize it in that case:

i = StringIO(i.getvalue())  # create a cStringIO.StringO instance for a cStringIO.StringI instance.

For the python version (the `StringIO` module), simply seek to the start again:

i.seek(0)

You do not need to specify a file mode for the `Image.open()` call; unless `i` is a string it'll be ignored in any case:

img = Image.open(i)

Problem

I am trying to convert the output of pyBarcode to a PIL Image file without first saving an image. First off, pyBarcode generates an image file like such: ``` >>> import barcode >>> from barcode.writer import ImageWriter >>> ean = barcode.get_barcode('ean', '123456789102', writer=ImageWriter()) >>> filename = ean.save('ean13') >>> filename u'ean13.png' ``` As you can see above, I don't want the image to be actually saved on my filesystem because I want the output to be processed into a PIL Image. So I did some modifications: ``` i = StringIO() ean = barcode.get_barcode('ean', '123456789102', writer=ImageWriter()) ean.write(i) ``` Now I have a StringIO file object and I want to PIL to "read" it and convert it to a PIL Image file. I wanted to use `Image.new` or `Image.frombuffer` but both these functions required me to enter a size...can't the size be determined from the barcode StringIO data? `Image.open` states this in their documentation: You can use either a string (representing the filename) or a file object. In the latter case, the file object must implement read, seek and tell methods, and be opened in binary mode Isn't a StringIO instance a file object as well? How do I open it as a binary file? ``` Image.open(i, 'rb') >>> Image.open(i, 'rb') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/mark/.virtualenvs/barcode/local/lib/python2.7/site-packages/PIL/Image.py", line 1947, in open raise ValueError("bad mode") ValueError: bad mode ``` I'm sure I'm pretty close to the answer I just need someone's guidance. Thanks in advance guys!

Original source