How to get image size (bytes) using PIL

非 Y 不嫁゛ 提交于 2019-12-14 03:43:18

问题


I found out how to use PIL to get the image dimensions, but not the file size in bytes. I need to know the file size to decide if the file is too big to be uploaded to the database.


回答1:


Try:

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



回答2:


If you already have the image on the filesystem:

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

If, however, you want to get the saved size of an image that is in memory and has not been saved to the filesystem:

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

This method will avoid multiple reads of the image data as with StringIO. Note, however, that it will use more RAM. Everything is a tradeoff. :-)

Edit: I just saw this comment from the OP:

finally, the problem is from the beginnig, if someone will upload a picture that have 1 giga (forged one) he'll kill the server before PIL will do its stuff, so i must block the request before it finishs!

This is a very different question, and is probably best accomplished at the web server. For nginx, you can add this to your configuration:

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



回答3:


I'm a bit late to this, but I came across this question 5 mins ago when searching how to get the size of a PIL image without saving it to disk. In case anyone else comes across this, this is a simple way of doing it:

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)



回答4:


I think this is the true measure and the fastest one of the size of the image in bytes in memory:

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

Then, the size of the file on disk depends on the format of the file:

    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)

Possible output for 32 x 32 x 3 images from CIFAR10 dataset:

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



回答5:


To find the Size(In bytes) of an image using Pillow Library, please use the below code. It will working fine.

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

Make sure that you have pillow library installed:-

pip install pillow


来源:https://stackoverflow.com/questions/11904083/how-to-get-image-size-bytes-using-pil

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!