图像裁剪工具(Python)

23

我是一名胶片摄影师,经常需要裁剪/调整图片大小。因为我使用的是底片相机,所以我需要扫描我的底片并从批量扫描中裁剪出每一帧。我的扫描仪每次可以扫描四个带有六张图片的条带(每次扫描24帧/裁剪)。

我的朋友为我编写了一个Python脚本,可以根据输入的坐标自动裁剪图片。这个脚本运行良好,但导出图像的文件格式存在问题。

从扫描结果来看,每帧应该生成一个240 DPI、37mb的TIFF文件(当我在Adobe Lightroom中进行裁剪和导出时)。然而,这个裁剪工具输出的是一个72 DPI、13mb的TIFF文件。

终端(我在Mac上)每次运行这个裁剪工具时都会警告我有一个“解压缩炸弹”的问题。我的朋友很困惑,建议我向Stack Overflow求助。

我没有Python经验。我可以提供他编写的代码和终端给我的命令。

您有什么想法吗?这将是非常感谢和巨大的时间节省。谢谢!

ERROR MESSAGE: /Library/Python/2.7/site-packages/PIL/Image.py:2192: DecompressionBombWarning: Image size (208560540 pixels) exceeds limit of 89478485 pixels, could be decompression bomb DOS attack.
2个回答

57

PIL仅仅是在保护您。它不会打开更大的图像,因为这可能成为恶意用户攻击的向量,他们会给您一个大图像,该图像将扩展以使用所有内存。引用PIL.Image.open() documentation中的内容:

警告:为了防止“解压缩炸弹”引起的潜在DOS攻击(即恶意文件,其解压缩为大量数据,并旨在通过使用大量内存来崩溃或造成破坏),Pillow将发出DecompressionBombWarning如果图像超过某个限制。

由于您不是恶意用户,也没有从任何其他人那里接受图像,因此可以简单地禁用限制:

from PIL import Image

Image.MAX_IMAGE_PIXELS = None

设置 Image.MAX_IMAGE_PIXELS 可以完全禁用检查。您还可以将其设置为(高)整数值;默认值为 1024 * 1024 * 1024 // 4 // 3,近9000万像素或大约250MB未压缩数据的3通道图像。请注意,对于PIL版本4.3.0及以下,默认情况下只会发出警告。您也可以禁用警告:
import warnings
from PIL import Image

warnings.simplefilter('ignore', Image.DecompressionBombWarning)

相反,如果你想完全防止这些图片被加载,将警告转换为异常:

import warnings
from PIL import Image

warnings.simplefilter('error', Image.DecompressionBombWarning)

然后,当您传递一张本应占用大量内存的图片时,您可以期望会引发 Image.DecompressionBombWarning 对象作为异常。

PIL v5.0.0(发布于2018年1月)开始,使用比MAX_IMAGE_PIXELS值多两倍像素的图像将导致一个PIL.Image.DecompressionBombError异常。

请注意,这些检查也适用于Image.crop()操作(通过裁剪可以创建一个更大的图像),如果您想在处理GIF或ICO文件时受益于此保护,请使用PIL版本6.2.0或更新版本(于2019年10月发布)。


1
谢谢!关于禁用像素限制的那一部分,让我省了好几个小时去尝试如何处理它。 - coredumperror
1
@buran:谢谢你提醒我!这是一个重要的细节,所以我已经更新了我的答案。 - Martijn Pieters

5

来自Pillow文档

警告:为了防止“解压缩炸弹”(即恶意文件,它们会解压缩成大量数据,并设计成通过使用大量内存来崩溃或造成破坏的文件)可能导致的潜在DOS攻击,如果图像超过一定限制,Pillow将发出一个DecompressionBombWarning。如果需要,可以使用warnings.simplefilter('error', Image.DecompressionBombWarning)将警告转换为错误,或使用warnings.simplefilter('ignore', Image.DecompressionBombWarning)完全忽略警告。还可以参见日志记录文档,将警告输出到日志记录设施而不是stderr。


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