来自 io.BytesIO 的 Tell() 方法未返回正确的图像权重

Tell() method from io.BytesIO not returning the correct image weight

每当我调用 os.path.getsize(file) 时,它都会给我正确的尺寸。当图像超过固定权重时,我必须对其进行变换然后询问新图像的权重。

我有一个非常基本的功能来 return 图像的权重。原因是我想避免通过文件系统。

def get_weight(image: Image, img_format: str) -> int:
    out = io.BytesIO()
    image.save(out, format=img_format)
    return out.tell()

据我了解,它通过字节流复制图像的内容,然后 return 位置。我从它的名字假设流缓冲区大小是一个字节,因此 position == image weight in bytes.

它不能与 JPEG 格式一致地工作。我的图片的权重被低估了 20%(在 4 到 8 MB 范围内)。

为什么会这样?

Image.save() 中的参数 quality 默认设置为 75

如果图片原本质量高于75,可能会低估权重。反之,如果原始质量低于75,其权重可能被高估。

据此anwer about JPEG quality in Pillow,可以通过将质量设置为"keep"来保持图像的原始质量。这样做将以更相似的长度重现图像的原始字节流。