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