【PIL读取报错处理】PIL.Image.DecompressionBombError:由于图像尺寸过大,超出了 Pillow 库的默认限制,从而引发了潜在的安全风险提示

【PIL读取报错处理】PIL.Image.DecompressionBombError:由于图像尺寸过大,超出了 Pillow 库的默认限制,从而引发了潜在的安全风险提示



欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文,可关注VX“学术会议小灵通”或参考学术信息专栏:https://blog.csdn.net/gaoxiaoxiao1209/article/details/146181864


PIL.Image.DecompressionBombError 错误是由于图像尺寸过大,超出了 Pillow 库的默认限制,从而引发了潜在的安全风险提示。此错误的完整信息是:

Image size (401815416 pixels) exceeds limit of 178956970 pixels, could be decompression bomb DOS attack.

解释

  • Decompression Bomb:这是图像处理中的一种安全防护机制,目的是防止恶意用户利用特定的图像格式通过过度压缩图像,制造出解压后非常大的图像,从而造成内存溢出(DoS
    攻击,拒绝服务攻击)。这种情况称为“解压炸弹”。
  • Image size:这是指图像的像素总数。例如,图像的尺寸是 10,000 x 10,000 像素,那么图像的像素总数就是
    100,000,000(即 1 亿像素)。
  • Limit:Pillow 默认限制了图像的最大像素数(在你的情况中为 178,956,970 像素)。当图像的像素数超出该限制时,Pillow 会抛出 DecompressionBombError 错误。

解决办法

增加 Pillow 的图像尺寸限制

如果你确定图像不是恶意的,并且希望继续处理该图像,可以增加 Pillow 的默认限制。你可以通过设置 Image.MAX_IMAGE_PIXELS 来更改图像尺寸限制。

from PIL import Image

# 设置较大的限制值
Image.MAX_IMAGE_PIXELS = None  # 或者设置为一个较大的值,例如 10亿

这样,Pillow 就不会因为图像尺寸过大而抛出 DecompressionBombError 错误了。注意,这个操作可能会导致内存使用量剧增,尤其是对于非常大的图像。

检查图像的尺寸

在读取图像之前,可以先检查图像的尺寸,确保它在合理范围内,避免加载过大的图像。

with Image.open(img_path) as img:
    print(f"Image size: {img.size}")  # 输出图像尺寸
    if img.size[0] * img.size[1] > 178956970:
        print("The image is too large!")

使用其他方法读取和处理大图像:

  • 如果你的图像非常大,可以考虑使用 rasterio 等专门处理大规模地理数据的库,它允许按需读取和处理遥感图像,避免一次性加载整个图像到内存中。
  • 你还可以尝试将图像裁剪成较小的块来逐步处理。

示例代码

from PIL import Image

# 设置较大的限制值
Image.MAX_IMAGE_PIXELS = 500000000  # 设置更大的限制

# 读取图像
img_path = r'E:\gaoxiao\glacier\冰川提取影像及标签\gansuRGB_8bit.tif'
img = Image.open(img_path)
print(f'Image size: {img.size}')

如果图像尺寸超出限制,Pillow 会自动抛出 DecompressionBombError 错误,你可以根据需要决定是增加限制还是采用其他处理方法。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐