Reputation: 4440
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.
Upvotes: 53
Views: 81394
Reputation: 7834
If you already have the image on the filesystem:
import os
# Get the size in bytes.
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()
# quality='keep' is a Pillow setting that maintains the quantization of the image.
# Not having the same quantization can result in different sizes between the in-
# memory image and the file size on disk.
image.save(img_file, "png", quality = "keep")
image_file_size = img_file.tell()
NOTE: if you use a different quality setting for each method you can end up with a smaller size in one or the other.
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 {
# or whatever size you want as your limit
client_max_body_size 100m;
}
Upvotes: 28
Reputation: 1158
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
Upvotes: 17
Reputation: 97
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
Upvotes: 7
Reputation: 3495
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)
Upvotes: 5