使用 Python 将像素转换为厘米

问题描述 投票:0回答:1

我想知道这段代码我做错了什么:

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 像素.

我将使用一个临时列表来写入像素值,然后进行转换,但我想知道是否有更快的方法,以及为什么它会制造一个压缩炸弹。

谢谢!

python converters pixel denial-of-service cm
1个回答
1
投票

问题是您尝试打开的图片太大,解压会消耗大量内存,这可能是一个潜在的安全风险(称为“解压炸弹”)。为了避免这种情况,您可以通过修改

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()
方法调整图片大小

© www.soinside.com 2019 - 2024. All rights reserved.