В этой небольшой записке я покажу, как извлечь некоторые полезные метаданные из изображений с помощью
Такие устройства, как цифровые камеры, смартфоны и сканеры, используют стандарт EXIFએ для сохранения изображений или аудиофайлов. Этот стандарт содержит множество полезных тегов для извлечения, которые могут быть полезны для судебных расследований. например, марка, модель устройства, точная дата и время создания изображения и даже информация GPS на некоторых устройствах.
Обратите внимание, что есть абсолютно бесплатные инструменты для извлечения метаданных, такие как
Для начала вам необходимо установить библиотеку 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-адреса загрузите все изображения, а затем запустить описанный сценарий для каждого из полученных, изучите результаты!
Пример для подражания
Как с помощью Python извлечь метаданные изображения, опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.
Респект и уважуха