PIL cannot identify image file for io.BytesIO object
(This solution is from the author himself. I have just moved it here.)
SOLUTION:
# This portion is part of my test codebyteImgIO = io.BytesIO()byteImg = Image.open("some/location/to/a/file/in/my/directories.png")byteImg.save(byteImgIO, "PNG")byteImgIO.seek(0)byteImg = byteImgIO.read()# Non test codedataBytesIO = io.BytesIO(byteImg)Image.open(dataBytesIO)
The problem was with the way that Image.tobytes()
was returning the byte object. It appeared to be invalid data and the 'encoding' couldn't be anything other than raw which still appeared to output wrong data since almost every byte appeared in the format \xff\
. However, saving the bytes via BytesIO and using the .read()
function to read the entire image gave the correct bytes that when needed later could actually be used.
image = Image.open(io.BytesIO(decoded))# File "C:\Users\14088\anaconda3\envs\tensorflow\lib\site-packages\PIL\Image.py", line 2968, in open# "cannot identify image file %r" % (filename if filename else fp)# PIL.UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x000002B733BB11C8>
===I fixed as worked:message = request.get_json(force=True)
encoded = message['image']# https://stackoverflow.com/questions/26070547/decoding-base64-from-post-to-use-in-pil#image_data = re.sub('^data:image/.+;base64,', '', message['image'])image_data = re.sub('^data:image/.+;base64,', '', encoded)# Remove extra "data:image/...'base64" is Very important# If "data:image/...'base64" is not remove, the following line generate an error message: # File "C:\Work\SVU\950_SVU_DL_TF\sec07_TF_Flask06_09\32_KerasFlask06_VisualD3\32_predict_app.py", line 69, in predict# image = Image.open(io.BytesIO(decoded))# File "C:\Users\14088\anaconda3\envs\tensorflow\lib\site-packages\PIL\Image.py", line 2968, in open# "cannot identify image file %r" % (filename if filename else fp)# PIL.UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x000002B733BB11C8># image = Image.open(BytesIO(base64.b64decode(image_data)))decoded = base64.b64decode(image_data)image = Image.open(io.BytesIO(decoded))# return json.dumps({'result': 'success'}), 200, {'ContentType': 'application/json'}#print('@app.route => image:')#print()processed_image = preprocess_image(image, target_size=(224, 224))prediction = model.predict(processed_image).tolist()#print('prediction:', prediction)response = { 'prediction': { 'dog': prediction[0][0], 'cat': prediction[0][1] }}print('response:', response)return jsonify(response)