Определение разрешения изображения

В этом примере посмотрим, как определить разрешение JPEG-изображения, не используя внешние библиотеки. Размеры вытаскиваются прямо из заголовка файла.

Что нужно знать

Перед изучением примера полезно понимать:

Описание задачи

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 позиций влево и складываем с младшим. В конце выводим итоговое разрешение.