2016-10-06 14 views
0

python 3.4のピロー3.3.1を使用して大きな画像を保存しようとしています。これらの画像は、uint8 RGBピクセルとして1〜4 GBの範囲にある傾向があります。 LinuxとOSXは私に同じ結果を与えます。PIL.Image.fromArrayを読み込む際のPILオーバーフローエラー

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 

にバッファを取得するには、私は、バッファの長さのためUINT32を使用と思った私はPILのpython 3で使用して考える最大、より小さい。 Python 2のPILはint32を使用し、max 2 ** 31-1となります。

このバグは、保存するコーデックを決定する前に表示されます。例えば、私はどのように1が2ギガバイト(2147483647バイト)よりも大きな画像を保存するについて行くことができ
pilImage.save(BytesIO(), format="png")
または
pilImage.save(BytesIO(), format="tiff")

を経由して、ロスレスPNGまたはTIFを保存するためにどちらかご希望ですか?

編集: fixed a while agoのように見えます。なぜ問題がまだ現れているのか分かりません。

+0

それが[未解決の問題](https://github.com/python-pillow/Pillow/issues/1475)だように見えます。 Pythonの純粋でない – Carpetsmoker

+0

ライブラリは依然として32ビット整数に制限することができます。 –

答えて

0

あなたが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. 
>>> 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 

は10ギガバイト、8ビット、Perlinノイズの100,000×10万ピクセルの画像を作成します。それはちょっとですが、最終的な書き込みはラップトップで約3分で、RAMが100MB必要です。 Pythonバインディングはhereと記載されています。

あなたはできmove images between numpy and vips、それは悲しいことに、巨大な文字列を割り当て、コピーすることによって行われるので、あなたはそのためのメモリをたくさん必要だけれども。あなたはあなたの必要に応じて、vipsの操作だけであなたが望むことをすることができるかもしれません。

関連する問題