Я понимаю, что вы можете получить размер изображения с помощью PIL следующим образом
from PIL import Image
im = Image.open(image_filename)
width, height = im.size
Однако я хотел бы получить ширину и высоту изображения, не загружая изображение в память. Это возможно? Я занимаюсь статистикой только по размерам изображений и не забочусь о содержимом изображений. Я просто хочу ускорить обработку.
python
image
image-processing
Сами А. Хайджа
источник
источник
.open()
считывает весь файл в память ... (это то, что.load()
) делает - насколько я знаю - это настолько хорошо, насколько это возможноPIL
pmap
для мониторинга памяти, используемой процессом, показал мне, что действительноPIL
не загружает все изображение в память.Ответы:
Как указано в комментариях, PIL не загружает изображение в память при вызове
.open
. Глядя на документыPIL 1.1.7
, в строке документации для.open
говорится:В источнике есть несколько файловых операций, например:
но вряд ли это означает чтение всего файла. Фактически,
.open
в случае успеха просто возвращает объект файла и имя файла. Кроме того, в документах говорится:Копнув глубже, мы видим, что эти
.open
вызовы_open
являются перегрузкой, специфичной для формата изображения. Каждую из реализаций_open
можно найти в новом файле, например. Файлы .jpeg находятся в форматеJpegImagePlugin.py
. Давайте рассмотрим это подробнее.Здесь все кажется немного сложным, в нем есть бесконечный цикл, который прерывается при нахождении маркера jpeg:
Похоже, он мог прочитать весь файл, если он был искажен. Однако, если он читает информационный маркер в порядке, он должен прерваться раньше. В
handler
конечном итоге функция устанавливаетself.size
размеры изображения.источник
open
получает ли размер изображения или это тоже ленивая операция? А если ленив, читает ли при этом данные изображения?Docs/PIL.Image.html
..jpeg
Формат выглядит ОК, пока найден заголовок.Если вас не волнует содержимое изображения, PIL, вероятно, будет излишним.
Предлагаю разобрать вывод магического модуля python:
Это оболочка для libmagic, которая считывает как можно меньше байтов, чтобы идентифицировать подпись типа файла.
Соответствующая версия скрипта:
https://raw.githubusercontent.com/scardine/image_size/master/get_image_size.py
[Обновить]
Похоже, JPEG устойчив к магии. :-)
Я понимаю, почему: чтобы получить размеры изображения для файлов JPEG, вам, возможно, придется прочитать больше байтов, чем libmagic любит читать.
Засучив рукава, я получил этот непроверенный фрагмент (получите его с GitHub) , для которого не требуются сторонние модули.
[обновление 2019]
Ознакомьтесь с реализацией Rust: https://github.com/scardine/imsz
источник
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
MacOS, включите python3data = input.read(25)
,file
изображение даетPNG image data, 720 x 857, 8-bit/color RGB, non-interlaced
На pypi есть пакет,
imagesize
который у меня сейчас работает, хотя не выглядит очень активным.Установить:
Использование:
Домашняя страница: https://github.com/shibukawa/imagesize_py
PyPi: https://pypi.org/project/imagesize/
источник
Я часто ищу размеры изображений в Интернете. Конечно, вы не можете загрузить изображение, а затем загрузить его для анализа информации. Слишком много времени. Мой метод - загружать фрагменты в контейнер изображений и каждый раз проверять, может ли он анализировать изображение. Остановите цикл, когда я получу нужную мне информацию.
Я извлек ядро своего кода и изменил его для анализа локальных файлов.
Вывод:
Фактический размер файла составляет 1 543 580 байт, и вы читаете только 38 912 байт, чтобы получить размер изображения. Надеюсь, это поможет.
источник
Еще один короткий способ сделать это в системах Unix. Это зависит от вывода,
file
который, я не уверен, стандартизирован для всех систем. Вероятно, это не следует использовать в производственном коде. Более того, большинство файлов JPEG не сообщают размер изображения.источник
IndexError: list index out of range
У этого ответа есть другое хорошее разрешение, но отсутствует формат pgm . Этот ответ разрешил ошибку pgm . И я добавляю BMP .
Коды ниже
источник
imghdr
однако довольно плохо обрабатывает некоторые JPEG.