I\'m writing a program which can receive images in a variety of common image formats but needs to examine them all in one consistent format. It doesn\'t really matter what image
There are two types of cStringIO.StringIO()
objects depending on how the instance was created; one for just reading, the other for writing. You cannot interchange these.
When you create an empty cStringIO.StringIO()
object, you really get a cStringIO.StringO
(note the O
at the end) class, it can only act as output, i.e. write to.
Conversely, creating one with initial content produces a cStringIO.StringI
object (ending in I
for input), you can never write to it, only read from it.
This is particular to just the cStringIO
module; the StringIO
(pure python module) does not have this limitation. The documentation uses the aliases cStringIO.InputType and cStringIO.OutputType for these, and has this to say:
Another difference from the
StringIO
module is that callingStringIO()
with a string parameter creates a read-only object. Unlike an object created without a string parameter, it does not have write methods. These objects are not generally visible. They turn up in tracebacks asStringI
andStringO
.
Use cStringIO.StringO.getvalue()
to get the data out of an output file:
# replace cStringIO.StringO (output) with cStringIO.StringI (input)
cimage = cStringIO.StringIO(cimage.getvalue())
cimage = Image.open(cimage)
You can use io.BytesIO() instead, but then you need to rewind after writing:
image = Image.open(io.BytesIO(raw_image)).convert("RGB")
cimage = io.BytesIO()
image.save(cimage, format="BMP")
cimage.seek(0) # rewind to the start
cimage = Image.open(cimage)