Python中的Pillow不能打开图像(“超出限制”)

82

我在Python中运行天气数据的模拟时遇到了一些问题。数据以.tif格式提供,因此我使用了以下代码尝试打开图像并将数据提取到numpy数组中。

from PIL import Image

im = Image.open('jan.tif')

但是当我运行这段代码时,出现了以下错误:

PIL.Image.DecompressionBombError: Image size (933120000 pixels) exceeds limit of 178956970 pixels, could be decompression bomb DOS attack.

看起来这只是一种针对此类攻击的保护措施,但我实际上需要这些来自可靠来源的数据。有没有什么方法可以绕过这个问题,还是我得另寻他路?

3个回答

111

尝试

PIL.Image.MAX_IMAGE_PIXELS = 933120000

如何找到这样的事情?

import PIL
print(PIL.__file__)  # prints, e. g., /usr/lib/python3/dist-packages/PIL/__init__.py

那么

cd /usr/lib/python3/dist-packages/PIL
grep -r -A 2 'exceeds limit' .
打印
./Image.py:            "Image size (%d pixels) exceeds limit of %d pixels, "
./Image.py-            "could be decompression bomb DOS attack." %
./Image.py-            (pixels, MAX_IMAGE_PIXELS),

那么

grep -r MAX_IMAGE_PIXELS .

打印

./Image.py:MAX_IMAGE_PIXELS = int(1024 * 1024 * 1024 / 4 / 3)
./Image.py:    if MAX_IMAGE_PIXELS is None:
./Image.py:    if pixels > MAX_IMAGE_PIXELS:
./Image.py:            (pixels, MAX_IMAGE_PIXELS),

那么

python3
import PIL.Image
PIL.Image.MAX_IMAGE_PIXELS = 933120000

工作无怨言并解决您的问题。


49
如果您对输入内容百分之百信任,您也可以使用 PIL.Image.MAX_IMAGE_PIXELS = None 完全禁用检查。 - OrangeDog

72
在导入之后,添加:
Image.MAX_IMAGE_PIXELS = None

2
老兄,你真是太棒了。 - ASLAN
1
有时候这样的比较会失败,例如 if w*h > Image.MAX_IMAGE_PIXELS:,并出现错误 TypeError: '>' not supported between instances of 'int' and 'NoneType' - Amit Sharma

1

PIL.Image.MAX_IMAGE_PIXELS = None,不要使用这个,而是使用Image.MAX_IMAGE_PIXELS = None,这样可以正常工作。


1
这个答案已经存在。 - Azhar Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接