Определение разрешения изображения
В этом примере посмотрим, как определить разрешение JPEG-изображения, не используя внешние библиотеки. Размеры вытаскиваются прямо из заголовка файла.
Что нужно знать
Перед изучением примера полезно понимать:
Функции в Python — функции
Пользовательские функции в Python — пользовательские функции
Работа с файлами Python — работа с файлами
Описание задачи
JPEG (произносится «джей-пег») — это аббревиатура от Joint Photographic Experts Group. Один из самых распространённых способов сжатия изображений.
У большинства форматов файлов в начале есть заголовок — несколько первых байтов с полезной информацией о файле. В JPEG-заголовке хранятся высота, ширина, число цветов (оттенки серого или RGB) и другие данные. В этой программе мы определим разрешение JPEG-изображения, прочитав именно эти байты — без внешних библиотек.
Исходный код
def jpeg_res(filename):
""""This function prints the resolution of the jpeg image file passed into it"""
# open image for reading in binary mode
with open(filename,'rb') as img_file:
# height of image (in 2 bytes) is at 164th position
img_file.seek(163)
# read the 2 bytes
a = img_file.read(2)
# calculate height
height = (a[0] << 8) + a[1]
# next 2 bytes is width
a = img_file.read(2)
# calculate width
width = (a[0] << 8) + a[1]
print("The resolution of the image is",width,"x",height)
jpeg_res("img1.jpg")
Вывод
The resolution of the image is 280 x 280
Как это работает
Файл открывается в бинарном режиме — это обязательно для не-текстовых файлов. По стандарту JFIF высота изображения находится в позиции 164 (индекс 163), сразу за ней — ширина. Каждое значение занимает 2 байта.
Предупреждение
Это работает только для формата JFIF (JPEG File Interchange Format). Если изображение закодировано по другому стандарту, например EXIF, код работать не будет.
Чтобы получить число из двух байт, используем побитовый сдвиг <<. Старший байт сдвигаем на 8 позиций влево и складываем с младшим. В конце выводим итоговое разрешение.