PILを使用して画像のサイズを取得する方法はわかりましたが、ファイルサイズ(バイト単位)はわかりませんでした。ファイルが大きすぎてデータベースにアップロードできないかどうかを判断するには、ファイルサイズを知る必要があります。
試してください:
import os
print os.stat('somefile.ext').st_size
ファイルシステムにすでにイメージがある場合:
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ギガ(偽造)の写真をアップロードする場合、PILが処理する前にサーバーを強制終了するので、完了する前に要求をブロックする必要があります。
これは非常に異なる質問であり、おそらくWebサーバーで実行するのが最善です。 nginxの場合、これを構成に追加できます。
http {
#...
client_max_body_size 100m; # or whatever size you want as your limit
#...
}
これは本当の測定であり、メモリ内のバイト単位の画像のサイズの中で最も速いものだと思います:
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
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