38

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

4

5 回答 5

44

尝试:

import os
print os.stat('somefile.ext').st_size
于 2012-08-10T14:49:35.927 回答
16

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

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 看到这条评论:

最后,问题是从一开始的,如果有人上传一张有 1 giga(伪造的)的图片,他会在 PIL 完成它的工作之前杀死服务器,所以我必须在它完成之前阻止请求!

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

http {
    #...
        client_max_body_size 100m; # or whatever size you want as your limit
    #...
}
于 2016-02-05T16:50:10.167 回答
13

我认为这是内存中图像大小(以字节为单位)的真正衡量标准和最快的衡量标准:

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
于 2018-07-09T12:43:17.027 回答
6

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

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

确保您安装了枕头库:-

pip install pillow
于 2018-11-26T05:57:27.333 回答
4

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

import StringIO
output = StringIO.StringIO()
image_output.save(output, 'PNG') #a format needs to be provided
contents = output.getvalue()
output.close()

image_filesize = len(contents)
于 2015-09-24T13:12:46.020 回答