81

Just having some problems running a simulation on some weather data in Python. The data was supplied in a .tif format, so I used the following code to try to open the image to extract the data into a numpy array.

from PIL import Image

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

But when I run this code I get the following error:

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

It looks like this is just some kind of protection against this type of attack, but I actually need the data and it is from a reputable source. Is there any way to get around this or do I have to look for another way to do this?

Alfe
  • 56,346
  • 20
  • 107
  • 159
Tom Heeley
  • 978
  • 1
  • 7
  • 8

3 Answers3

110

Try

PIL.Image.MAX_IMAGE_PIXELS = 933120000

How to find out such a thing?

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

Then

cd /usr/lib/python3/dist-packages/PIL
grep -r -A 2 'exceeds limit' .

prints

./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),

Then

grep -r MAX_IMAGE_PIXELS .

prints

./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),

Then

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

Works without complaint and fixes your issue.

Alfe
  • 56,346
  • 20
  • 107
  • 159
  • 47
    If you 100% trust your inputs, you can also disable the check completely with `PIL.Image.MAX_IMAGE_PIXELS = None` – OrangeDog Oct 08 '18 at 10:08
70

After the imports, add :

Image.MAX_IMAGE_PIXELS = None
jadsq
  • 3,033
  • 3
  • 20
  • 32
Jaire Marques
  • 729
  • 5
  • 2
  • 1
    Dude, you are great – ASLAN Feb 03 '21 at 14:43
  • sometimes comparisons doing this would fail the conditions such as `if w*h > Image.MAX_IMAGE_PIXELS:` with an error `TypeError: '>' not supported between instances of 'int' and 'NoneType'` – Amit Sharma Jan 23 '23 at 10:41
0

PIL.Image.MAX_IMAGE_PIXELS = None , instead of this use Image.MAX_IMAGE_PIXELS = None this is working fine

PRAJAKTA
  • 93
  • 5