I have a .tiff image loaded into a PIL Image and I'm trying to obtain its byte array.
This is what I'm doing:
from PIL import Image
import io
def image_to_byte_array(image: Image) -> bytes:
imgByteArr = io.BytesIO()
image.save(imgByteArr, format=image.format)
imgByteArr = imgByteArr.getvalue()
return imgByteArr
im = Image.open(r"ImagePath")
im_bytes = image_to_byte_array(im)
The problem comes when I'm trying to save the image into imgByteArr.
Some .tiff images are throwing Error setting from dictionary and additionally I also get _TIFFVSetField: : Ignored tag "OldSubfileType" (not supported by libtiff).
Is there any workaround for these cases?
Here is a sample image
I'm in a rush at the moment, but there is something in the image (I'm guessing a tag or compression or some attribute) that prevents you from writing the image.
You can see the error generated more simply like this:
from PIL import Image
im = Image.open(...path...)
im.save('anything.tif')
One way to get rid of all the extended attributes and metadata is to convert the image to a Numpy array and from there back to a PIL Image. This "round-trip" through Numpy can't propagate any attributes, just pixels, so it then works:
import numpy as np
from PIL import Image
im = Image.open(...path...)
# Round-trip through Numpy array to strip attributes and metadata
im = Image.fromarray(np.array(im))
im.save('anything.tif') # works
I'll investigate further when I have time, but this may work as an interim method.