如何使用PIL获取图像大小(字节)

时间:2012-08-10 14:46:57

标签: python python-imaging-library tornado filesize

我发现了如何使用PIL来获取图像尺寸,而不是文件大小(以字节为单位)。我需要知道文件大小来决定文件是否太大而无法上传到数据库。

5 个答案:

答案 0 :(得分:20)

尝试:

import os
print os.stat('somefile.ext').st_size

答案 1 :(得分:7)

如果您已在文件系统上拥有该图像:

import os
os.path.getsize('path_to_file.jpg')`

但是,如果您想获取内存中尚未保存到文件系统的图像的已保存大小:

from io import BytesIO
img_file = BytesIO()
image.save(img_file, 'png')
image_file_size = img_file.tell()

与StringIO一样,此方法将避免多次读取图像数据。但请注意,它将使用更多RAM。一切都是权衡。 : - )

编辑:我刚从OP看到了这条评论:

  

最后,问题是来自beginnig,如果有人会上传一个   有1千兆(伪造的)的图片他会在PIL之前杀死服务器   会做它的东西,所以我必须在它完成之前阻止它!

这是一个非常不同的问题,可能最好在网络服务器上完成。对于nginx,您可以将其添加到您的配置中:

http {
    #...
        client_max_body_size 100m; # or whatever size you want as your limit
    #...
}

答案 2 :(得分:5)

我有点迟到了,但是我在5分钟前遇到了这个问题,当时我在搜索如何获取PIL图像的大小而不将其保存到磁盘上。如果有其他人遇到这个,这是一个简单的方法:

LC_ALL="en_US.UTF-8"

答案 3 :(得分:1)

我认为这是真正的衡量标准,也是内存中以字节为单位的最快图像大小之一:

print("img size in memory in bytes: ", sys.getsizeof(img.tobytes()))

然后,磁盘上文件的大小取决于文件的格式:

    from io import BytesIO
    img_file = BytesIO()
    img.save(img_file, 'png')
    img_file_size_png = img_file.tell()
    img_file = BytesIO()
    img.save(img_file, 'jpeg')
    img_file_size_jpeg = img_file.tell()
    print("img_file_size png: ", img_file_size_png)
    print("img_file_size jpeg: ", img_file_size_jpeg)

从CIFAR10数据集中获取32 x 32 x 3图像的可能输出:

img size in memory in bytes:  3105    
img_file_size png:  2488
img_file_size jpeg:  983

答案 4 :(得分:0)

要使用枕头库查找图像的大小(以字节为单位),请使用以下代码。它将正常工作。

from PIL import Image
image_file = Image.open(filename)
print("File Size In Bytes:- "+str(len(image_file.fp.read()))

确保已安装枕头库:-

pip install pillow