我是一名电影摄影师,他经常裁剪裁剪/调整图像。因为我拍摄胶片,我必须扫描我的底片,并从批量扫描中裁剪出每一帧。我的扫描仪扫描四条,每条六张图像(每次扫描24帧/作物)。
我的一位朋友给我写了一个Python脚本,它根据输入的坐标自动裁剪图像。该脚本运行良好但在导出图像的文件格式中存在问题。
从扫描开始,每帧应该在240 DPI时产生37mb TIFF(当我在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.
答案 0 :(得分:21)
PIL只是想保护你。它不会打开更大的图像,因为这可能成为恶意用户的攻击媒介,为您提供一个大图像,以扩展其用尽所有内存。
由于您不是恶意用户且不接受其他任何人的图像,因此您只需禁用限制:
from PIL import Image
Image.MAX_IMAGE_PIXELS = None
设置Image.MAX_IMAGE_PIXELS
完全禁用检查。您也可以将其设置为(高)整数值;对于3通道图像,默认值为int(1024 * 1024 * 1024 / 4 / 3)
,近9000万像素或约250MB未压缩数据。
请注意,默认情况下,所有发生的事情都是发出警告。您也可以禁用警告:
import warnings
from PIL import Image
warnings.simplefilter('ignore', Image.DecompressionBombWarning)
反过来说,如果你想阻止这些图像被完全加载,请将警告转为例外:
import warnings
from PIL import Image
warnings.simplefilter('error', Image.DecompressionBombWarning)
然后你可以期望在传递图像时将Image.DecompressionBombWarning
对象作为例外引发,否则会占用大量内存。
答案 1 :(得分:4)
来自Pillow docs:
警告:防止由" decompression bombs"引起的潜在DOS攻击(即,恶意文件会解压缩成大量数据,并且会因耗尽大量内存而崩溃或导致中断),如果图像超过某个限制,Pillow将发出
DecompressionBombWarning
。如果需要,可以将警告变为warnings.simplefilter('error', Image.DecompressionBombWarning)
的错误,或者使用warnings.simplefilter('ignore', Image.DecompressionBombWarning)
完全取消。另请参阅the logging documentation以将警告输出到日志记录工具而不是stderr。