Я пытаюсь хранить большие изображения с помощью подушки 3.3.1 на python 3.4. Эти изображения, как правило, находятся в диапазоне от 1 до 4 ГБ, как пиксели uint8 RGB. Linux и OSX дают мне тот же результат.PIL OverflowError при загрузке PIL.Image.fromArray
from PIL import Image
import numpy as np
imgArray = np.random.randint(255, size=(39000, 35000, 3)).astype(np.uint8)
print("buffer size:", imgArray.size)
print("image max bytes:", 2**32)
pilImage = Image.fromarray(imgArray)
я получаю следующие выходные данные
buffer size: 4095000000
image max bytes: 4294967296
Traceback (most recent call last):
File "storeLargeImage.py", line 6, in <module>
pilImage = Image.fromarray(imgArray)
File "/home/mpesavento/miniconda3/lib/python3.4/site-packages/PIL/Image.py", line 2189, in fromarray
return frombuffer(mode, size, obj, "raw", rawmode, 0, 1)
File "/home/mpesavento/miniconda3/lib/python3.4/site-packages/PIL/Image.py", line 2139, in frombuffer
return frombytes(mode, size, data, decoder_name, args)
File "/home/mpesavento/miniconda3/lib/python3.4/site-packages/PIL/Image.py", line 2074, in frombytes
im.frombytes(data, decoder_name, args)
File "/home/mpesavento/miniconda3/lib/python3.4/site-packages/PIL/Image.py", line 736, in frombytes
s = d.decode(data)
OverflowError: size does not fit in an int
буфер меньше максимума, я думаю, PIL использует в Python 3, который я думал, использовал UInt32 для длины буфера. PIL в python 2 использует int32, делая max 2 ** 31-1.
Эта ошибка возникает перед определением кодека для хранения. Например, я хотел бы либо хранить без потерь PNG или TIF, с помощью
pilImage.save(BytesIO(), format="png")
или
pilImage.save(BytesIO(), format="tiff")
Как можно идти о сохранении изображения больше, чем 2 GB (2147483647 байт)?
Редактировать: Похоже, что это должно было быть fixed a while ago. Не знаю, почему проблема все еще проявляется.
Похоже, что это [открытая проблема] (https://github.com/python-pillow/Pillow/issues/1475). – Carpetsmoker
Библиотека, которая не является чистым Python, по-прежнему может быть ограничена 32-битными целыми числами. –