How to get image size (bytes) using PIL How to get image size (bytes) using PIL python python

How to get image size (bytes) using PIL


Try:

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


If you already have the image on the filesystem:

import osos.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 BytesIOimg_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    #...}


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 BytesIOimg_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:  2488img_file_size jpeg:  983