图像裁剪工具(Python)

23 投票
2 回答
21321 浏览
提问于 2025-04-20 05:33

我是一名胶卷摄影师,经常需要裁剪和调整图片大小。因为我拍的是胶卷,所以必须先扫描底片,然后从扫描的图像中裁剪出每一帧。我的扫描仪一次可以扫描四条,每条六张照片(每次扫描可以得到24帧)。

我的一个朋友为我写了一个Python脚本,可以根据输入的坐标自动裁剪图片。这个脚本运行得不错,但在导出图片的文件格式上出现了一些问题。

从扫描得到的每一帧应该能生成一个37MB的TIFF文件,分辨率是240 DPI(当我在Adobe Lightroom中裁剪和导出时)。但是,Cropper输出的却是一个13MB、72 DPI的TIFF文件。

我在Mac的终端中运行Cropper时,系统会警告我有一个“解压炸弹”的问题。我的朋友对此感到困惑,建议我去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 个回答

5

来自Pillow文档的内容:

警告:为了防止可能的拒绝服务攻击,这种攻击是通过“解压炸弹”造成的(也就是一些恶意文件,它们解压后会变得非常庞大,目的是占用大量内存,从而导致程序崩溃或出现其他问题),Pillow会在图像超过某个限制时发出DecompressionBombWarning警告。如果你想,可以通过warnings.simplefilter('error', Image.DecompressionBombWarning)把这个警告变成错误,或者通过warnings.simplefilter('ignore', Image.DecompressionBombWarning)完全忽略这个警告。想了解更多,可以查看日志记录文档,这样可以把警告输出到日志系统,而不是标准错误输出。

56

PIL其实是在保护你。它不会打开过大的图片,因为这可能会被恶意用户利用,给你发送一张大图片,导致你的内存被占满。引用一下PIL.Image.open()的文档

警告:为了防止可能的拒绝服务攻击(也就是“解压炸弹”,即恶意文件解压后会变成大量数据,旨在通过占用大量内存来崩溃或干扰系统),Pillow会在图片超过某个限制时发出DecompressionBombWarning警告。

既然你不是恶意用户,也不接受其他人的图片,你可以简单地关闭这个限制:

from PIL import Image

Image.MAX_IMAGE_PIXELS = None

设置Image.MAX_IMAGE_PIXELS可以完全关闭这个检查。你也可以将它设置为一个(很高的)整数值;默认值是1024 * 1024 * 1024 // 4 // 3,大约是9000万像素,或者对于一个3通道的图片来说,约250MB的未压缩数据。

需要注意的是,对于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月发布)。

撰写回答