2016-10-06 7 views
0

Я пытаюсь хранить большие изображения с помощью подушки 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. Не знаю, почему проблема все еще проявляется.

+0

Похоже, что это [открытая проблема] (https://github.com/python-pillow/Pillow/issues/1475). – Carpetsmoker

+0

Библиотека, которая не является чистым Python, по-прежнему может быть ограничена 32-битными целыми числами. –

ответ

0

Я понимаю, что вы спросили о PIL, но вы можете попробовать libvips. Он специализируется на больших изображениях (изображениях больше, чем ваша оперативная память) и не должен иметь проблем с файлами 4gb. Есть speed and memory use benchmarks on the vips website.

Например, я только что сделал:

$ python 
Python 2.7.12 (default, Jul 1 2016, 15:12:24) 
[GCC 5.4.0 20160609] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from gi.repository import Vips 
>>> x = Vips.Image.perlin(100000, 100000, uchar = True) 
>>> x.write_to_file("x.tif", bigtiff = True) 
>>> 
$ ls -l x.tif 
-rw-rw-r-- 1 john john 10000012844 Oct 7 11:43 x.tif 

Делает 10GB, 8 бит, 100 000 х 100 000 пикселей изображения из Perlin шума. Это займет немного времени, конечно ... окончательная запись - это около трех минут на моем ноутбуке и требуется 100 МБ ОЗУ. Связывание с Python документировано here.

Вы можете move images between numpy and vips, хотя это сделано путем выделения и копирования огромных строк, к сожалению, поэтому вам нужно много памяти для этого. Возможно, вы сможете делать то, что хотите, только с операциями vips, это зависит от ваших потребностей.

 Смежные вопросы

  • Нет связанных вопросов^_^