我试图在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。不确定为什么问题仍然存在。
答案 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。