我发现了如何使用 PIL 来获取图像尺寸,而不是文件大小(以字节为单位)。我需要知道文件大小来决定文件是否太大而无法上传到数据库。
问问题
50282 次
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 回答