Как получить размер изображения (байты) с помощью PIL

Я узнал, как использовать PIL для получения размеров изображения, но не размер файла в байтах. Мне нужно знать размер файла, чтобы решить, слишком ли большой файл для загрузки в базу данных.

Ответ 1

Try:

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

Ответ 2

Я немного опаздываю на это, но я столкнулся с этим вопросом 5 минут назад, когда искал, как получить размер изображения PIL, не сохраняя его на диск. В случае, если кто-то еще сталкивается с этим, это простой способ сделать это:

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)

Ответ 3

Если у вас уже есть изображение в файловой системе:

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. Обратите внимание, однако, что он будет использовать больше ОЗУ. Все это компромисс.: -)

Изменить: я только что увидел этот комментарий из OP:

наконец, проблема начинается с начала, если кто-то выгрузит картинка, имеющая 1 гига (кованая), он убьет сервер до PIL будет делать свои вещи, поэтому я должен заблокировать запрос до его завершения!

Это очень другой вопрос и, вероятно, лучше всего выполняется на веб-сервере. Для nginx вы можете добавить это в свою конфигурацию:

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