加载PIL.Image.fromArray时出现PIL OverflowError

时间:2016-10-06 23:43:54

标签: python pillow

我试图在python 3.4上使用枕头3.3.1存储大图像。这些图像往往在1到4 GB的范围内,作为uint8 RGB像素。 Linux和OSX给了我相同的结果。

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

我得到以下输出

pilImage.save(BytesIO(), format="png")

缓冲区小于我认为PIL在python 3中使用的最大值,我认为它使用uint32作为缓冲区长度。 python 2中的PIL使用int32,最大值为2 ** 31-1。

在我们确定用于存储的编解码器之前,会出现此错误。例如,我想通过
存储无损png或tif pilImage.save(BytesIO(), format="tiff")

{{1}}

如何保存大于2 GB(2147483647字节)的图像?

编辑: 它看起来应该是fixed a while ago。不确定为什么问题仍然存在。

1 个答案:

答案 0 :(得分:1)

我意识到你问过PIL,但你可以试试libvips。它专门处理大型图像(大于可用RAM的图像),并且您的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.
>>> import pyvips
>>> x = pyvips.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 x 100,000像素的Perlin噪声图像。当然需要一段时间---我的笔记本电脑上的最终写入时间约为3分钟,需要100MB的RAM。 Python绑定记录在here。你可以move images between numpy and vips