gpt4 book ai didi

python - 在 Python 中显示图像大小的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-05 02:30:08 33 4
gpt4 key购买 nike

使用 the idea from this code for changing image size动态循环,这里有点问题。有几种方法可以获取以字节为单位的图像大小,只有一种方法可以提供准确的结果,但这需要将文件保存在磁盘中。如果我每次都保存磁盘并再次读取它,那么每次迭代都会花费双倍的精力。有没有办法准确读取图像结果?

from PIL import Image
import os
import sys

image = Image.open(image_path
size_kb = os.stat(image_path).st_size
buffer = BytesIO()
image.save(buffer, format="jpeg", quality = 100, optimize = True) # Does not save but acts like an image saved to disc
size_kb2 = (buffer.getbuffer().nbytes)

打印 3 个不同的结果 print(size_kb, size_kb2, sys.getsizeof(image.tobytes()),) 为同一图像提供了 3 个不同的结果,其中 os.stat 给出准确的结果(与 Linux 操作系统显示的结果相同)

我不想把图像保存到光盘上再读一遍,因为这会花很多时间

完整代码:

STEP = 32
MIN_SIZE = 32

def resize_under_kb(image:Image,size_kb: float, desired_size:float)-> Image:
'''
Resize the image under given size in KB
args:
Image: Pil Image object
size_kb: Current size of image in kb
desired_size: Final desired size asked by user
'''
size = image.size
new_width_height = max(size) - STEP # Decrease the pixels for first pass

while new_width_height > MIN_SIZE and size_kb > desired_size: # either the image reaches minimun dimension possible or the desired possible size
image = image.resize((new_width_height,new_width_height)) # keep on resizing until you get to desired output

buffer = BytesIO()
image.save(buffer, format="jpeg", quality = 100, optimize = True) # Does not save but acts like an image saved to disc
size_kb = buffer.getbuffer().nbytes

size = image.size # Current resized pixels
new_width_height = max(size) - STEP # Dimensions for next iteration

return image

最佳答案

这段代码:

size_kb = os.stat(image_path).st_size

打印现有 JPEG 在磁盘上占用的字节数。


这段代码:

buffer = BytesIO()
image.save(buffer, format="jpeg", quality = 100, optimize = True) # Does not save but acts like an image saved to disc
size_kb2 = (buffer.getbuffer().nbytes)

打印图像在保存时将在磁盘上占用的字节数...通过 PIL 当前的 JPEG 编码器,具有自己的霍夫曼表和质量和色度二次采样,并且不允许文件系统最小块大小。

这可能与您最初从磁盘读取的大小有很大不同,因为它可能是由不同的软件创建的,具有不同的速度和质量权衡。它甚至可能在 PIL 的两个版本之间有所不同。


这段代码:

len(image.tobytes())

告诉您图像当前在内存中解压缩的字节数,不考虑图像所需的其他数据结构,也不考虑元数据(评论、GPS 数据、版权、制造商镜头数据和设置数据) .

关于python - 在 Python 中显示图像大小的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71950250/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com