来自 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"
来保持图像的原始质量。这样做将以更相似的长度重现图像的原始字节流。
每当我调用 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"
来保持图像的原始质量。这样做将以更相似的长度重现图像的原始字节流。