【问题标题】:Tell() method from io.BytesIO not returning the correct image weight来自 io.BytesIO 的 Tell() 方法未返回正确的图像权重
【发布时间】:2020-12-16 19:28:55
【问题描述】:

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

我有一个非常基本的函数来返回图像的权重。原因是我想避免通过文件系统。

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

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

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

为什么会这样?

【问题讨论】:

    标签: python io python-imaging-library


    【解决方案1】:

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

    如果图像最初的质量高于 75,则可能会低估权重。反之,如果原始质量低于 75,它的权重可能被高估了。

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

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多