Как с помощью Python извлечь метаданные изображения

Узнайте, как можно извлекать метаданные изображения, такие как информация GPS, марка камеры, модель и многое другое, с помощью Exchangeable Image File Format (EXIF) в Python с библиотекой Pillow.

В этой небольшой записке я покажу, как извлечь некоторые полезные метаданные из изображений с помощью библиотеки Pillow в Python.

Такие устройства, как цифровые камеры, смартфоны и сканеры, используют стандарт EXIF ​​для сохранения изображений или аудиофайлов. Этот стандарт содержит множество полезных тегов для извлечения, которые могут быть полезны для судебных расследований. например, марка, модель устройства, точная дата и время создания изображения и даже информация GPS на некоторых устройствах.

Обратите внимание, что есть абсолютно бесплатные инструменты для извлечения метаданных, такие как ImageMagick или ExifTool в Linux, моя цель — получить метаданные с помощью языка программирования Python.

Для начала вам необходимо установить библиотеку Pillow:

pip3 install Pillow

Откройте новый файл Python и запишите:

from PIL import Image
from PIL.ExifTags import TAGS

Теперь это будет работать только с файлами изображений JPEG, найдите в своих закромах любое изображение и пощупайте его, используя материалы этой записки (если вы хотите протестировать мое изображение, вы найдете его в репозитории учебника):

# путь к изображению или видео
imagename = "image.jpg"

# читать данные изображения с помощью PIL
image = Image.open(imagename)

После чтения изображения с помощью функции Image.open() вызовем метод getexif() для изображения, которая возвращает метаданные изображения:

# извлечь данные EXIF
exifdata = image.getexif()

Проблема с переменной exifdata заключается в том, что имена полей — это просто идентификаторы, а не удобочитаемое имена, поэтому нам понадобится словарь TAGS из модуля PIL.ExifTags, который отображает каждый идентификатор в человеческий текст:

# iterating over all EXIF data fields
for tag_id in exifdata:
    # получить имя тега вместо идентификатора
    tag = TAGS.get(tag_id, tag_id)
    data = exifdata.get(tag_id)
    # декодировать байты 
    if isinstance(data, bytes):
        data = data.decode()
    print(f"{tag:25}: {data}")

Вот какая у меня получилось утилитка, для которой в командной строке надо задавать имя файла:

from PIL import Image
from PIL.ExifTags import TAGS
import sys

# путь к изображению или видео
imagename = sys.argv[1]

# читать данные изображения с помощью PIL
image = Image.open(imagename)

# извлечь данные EXIF
exifdata = image.getexif()

# перебор всех полей данных EXIF
for tag_id in exifdata:
    # получить имя тега вместо нечитаемого идентификатора
    tag = TAGS.get(tag_id, tag_id)
    data = exifdata.get(tag_id)
    # декодировать байты 
    if isinstance(data, bytes):
        data = data.decode()
    print(f"{tag:25}:% {data}")

И результат:

ImageWidth               :% 5312
ImageLength              :% 2988
ResolutionUnit           :% 2
ExifOffset               :% 226
Make                     :% samsung
Model                    :% SM-G920F
Software                 :% G920FXXS4DPI4
Orientation              :% 1
DateTime                 :% 2016:11:10 19:33:22
YCbCrPositioning         :% 1
XResolution              :% 72.0
YResolution              :% 72.0

Куча полезных вещей, быстро погуглив Модель, я пришел к выводу, что это изображение было снято Samsung Galaxy S6. Запустите скрипт для изображений, снятых другими камерами, и вы увидите другие поля, возможно их будет больше.

Для утренней разминки достаточно, хватит. Для вас интересная задача — с интересного вам URL-адреса загрузите все изображения, а затем запустить описанный сценарий для каждого из полученных, изучите результаты!

Пример для подражания How to Extract Image Metadata in Python

Print Friendly, PDF & Email

CC BY-NC 4.0 Как с помощью Python извлечь метаданные изображения, опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.


Респект и уважуха

Добавить комментарий