我想知道这段代码我做错了什么:
if self.digital:
im = Image.open(os.path.join(folder, filename))
width, height = im.size
image_info["width"] = round(width / 37.79527559055, 0)
我想使用这段代码将图片的像素大小转换为厘米,但我不明白为什么它会返回这个问题:
Python311\Lib\site-packages\PIL\Image.py:3167: DecompressionBombWarning: Image size (130437549 pixels) exceeds limit of 89478485 pixels, could be decompression bomb DOS attack.
我不想在我的脚本中使用 DPI 1cm = 37.79527559055 像素.
我将使用一个临时列表来写入像素值,然后进行转换,但我想知道是否有更快的方法,以及为什么它会制造一个压缩炸弹。
谢谢!
问题是您尝试打开的图片太大,解压会消耗大量内存,这可能是一个潜在的安全风险(称为“解压炸弹”)。为了避免这种情况,您可以通过修改
Image.MAX_IMAGE_PIXELS
属性来增加 PIL 中图像的最大尺寸限制:
Image.MAX_IMAGE_PIXELS = None # No Limit
使用大图像时,考虑脚本的内存使用和性能很重要。
关于像素到厘米的转换,不推荐使用每厘米固定数量的像素,因为它取决于显示器的分辨率和显示器的物理尺寸。相反,您应该使用图像文件中嵌入的 DPI(每英寸点数)信息来执行转换。您可以使用图像对象的“信息”属性检索 DPI 信息,然后使用它来计算以厘米为单位的尺寸。
这是一个如何使用 DPI 信息进行转换的示例:
from PIL import Image
im = Image.open(os.path.join(folder, filename))
width, height = im.size
dpi = im.info.get("dpi", (72, 72))
width_cm = width / dpi[0] * 2.54
height_cm = height / dpi[1] * 2.54
image_info["width_cm"] = width_cm
image_info["height_cm"] = height_cm
您可以在处理图像之前将其调整为更小的尺寸。可以使用PIL提供的
Image.thumbnail()
方法调整图片大小