Рубрики
Без рубрики

Создайте зритель Exif с Pysimplegui

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Пакет подушек Дает вам возможность извлечь exif (обмен файл изображения) метаданные из изображений. Вы можете получить много информации о ваших изображениях через данные EXIF. Однако есть некоторые ключевые точки данных, которые более полезны, чем другие.

Для тех файлов данных приятно создавать графический интерфейс, чтобы вы могли просматривать его легко. Для этого учебника вы будете использовать Pysimplegui Отказ

Начиная

Обе подушки, так и Pysimplegui необходимо будет установить, чтобы иметь возможность следовать вместе с этим руководством. Вы можете установить их как с помощью PIP:

python -m pip install pillow PySimpleGUI

Вы можете захотеть установить эти пакеты в виртуальной среде Python. Вы можете использовать Виртуальский или встроенный Python модуль Venv Отказ

Независимо от того, какой путь вы в конечном итоге собираетесь, вы готовы написать свой код GUI!

Создание простого зрителя EXIF

Первый шаг – найти изображение, которое имеет данные exif в нем. Вы можете использовать этот, если вы хотите:

Когда вы закончите, написав свой код, ваш зритель EXIF будет выглядеть так:

Чтобы начать, создайте новый файл с именем exif_viewer.py и добавить этот код:

# exif_viewer.py

import PySimpleGUI as sg

from pathlib import Path
from PIL import Image
from PIL.ExifTags import TAGS

file_types = [("(JPEG (*.jpg)", "*.jpg"),
              ("All files (*.*)", "*.*")]

fields = {
    "File name": "File name",
    "File size": "File size",
    "Model": "Camera Model",
    "ExifImageWidth": "Width",
    "ExifImageHeight": "Height",
    "DateTime": "Creation Date",
    "static_line": "*",
    "MaxApertureValue": "Aperture",
    "ExposureTime": "Exposure",
    "FNumber": "F-Stop",
    "Flash": "Flash",
    "FocalLength": "Focal Length",
    "ISOSpeedRatings": "ISO",
    "ShutterSpeedValue": "Shutter Speed",
}


def get_exif_data(path):
    """
    Extracts the Exif information from the provided photo
    """
    exif_data = {}
    try:
        image = Image.open(path)
        info = image._getexif()
    except OSError:
        info = {}

    if info is None:
        info = {}

    for tag, value in info.items():
        decoded = TAGS.get(tag, tag)
        exif_data[decoded] = value

    return exif_data


def main():
    elements = [
        [
            sg.FileBrowse(
                "Load image data", file_types=file_types, key="load",
                enable_events=True
            )
        ]
    ]
    for field in fields:
        elements += [
            [sg.Text(fields[field], size=(10, 1)),
             sg.Text("", size=(25, 1), key=field)]
        ]
    window = sg.Window("Image information", elements)

    while True:
        event, values = window.read()
        if event == "Exit" or event == sg.WIN_CLOSED:
            break
        if event == "load":
            image_path = Path(values["load"])
            exif_data = get_exif_data(image_path.absolute())
            for field in fields:
                if field == "File name":
                    window[field].update(image_path.name)
                elif field == "File size":
                    window[field].update(image_path.stat().st_size)
                else:
                    window[field].update(exif_data.get(field, "No data"))


if __name__ == "__main__":
    main()

Это хороший кусок кода! Было бы запутано попытаться объяснить все это сразу, поэтому облегчить все, что вы пойдете по штуку кода по частям.

Вот первые несколько строк кода:

# exif_viewer.py

import PySimpleGUI as sg

from pathlib import Path
from PIL import Image
from PIL.ExifTags import TAGS

file_types = [("(JPEG (*.jpg)", "*.jpg"),
              ("All files (*.*)", "*.*")]

fields = {
    "File name": "File name",
    "File size": "File size",
    "Model": "Camera Model",
    "ExifImageWidth": "Width",
    "ExifImageHeight": "Height",
    "DateTime": "Creation Date",
    "static_line": "*",
    "MaxApertureValue": "Aperture",
    "ExposureTime": "Exposure",
    "FNumber": "F-Stop",
    "Flash": "Flash",
    "FocalLength": "Focal Length",
    "ISOSpeedRatings": "ISO",
    "ShutterSpeedValue": "Shutter Speed",
}

Первая половина этого кода является импортом, который вам нужно будет сделать функцию приложения. Далее вы создаете file_types Переменная. Это используется в диалоговом окне файла, который вы создадите позже, чтобы позволить пользователю выбрать изображение для загрузки.

Затем вы создаете словарь Python, который содержит все поля exif, которые вы хотите отобразить. Этот словарь отображает имя exif для более читаемого имени.

Теперь вы готовы узнать о get_exif_data () Функция:

def get_exif_data(path):
    """
    Extracts the EXIF information from the provided photo
    """
    exif_data = {}
    try:
        image = Image.open(path)
        info = image._getexif()
    except OSError:
        info = {}

    if info is None:
        info = {}

    for tag, value in info.items():
        decoded = TAGS.get(tag, tag)
        exif_data[decoded] = value

    return exif_data

Эта функция принимает путь к изображению и пытается извлечь из него данные EXIF. Если это не удается, он устанавливает Информация к пустому словарю. Если _getexif () Возвращает Нет Тогда вы также установили Информация к пустому словарю. Если Информация Заполняется, то вы зацикливаете через него и декодируете данные EXIF и заполните ваш exif_data словарь, прежде чем вернуть его.

Вы можете перейти к Главная () Функция следующая:

def main():
    elements = [
        [
            sg.FileBrowse(
                "Load image data", file_types=file_types, key="load",
                enable_events=True
            )
        ]
    ]
    for field in fields:
        elements += [
            [sg.Text(fields[field], size=(10, 1)),
             sg.Text("", size=(25, 1), key=field)]
        ]
    window = sg.Window("Image information", elements)

Здесь вы создаете все элементы, которые вам необходимо создать свой пользовательский интерфейс. Вы циклируете по словарю полей, которые вы определены в начале вашей программы и добавьте пару текстовых элементов управления, которые будут отображать данные EXIF, вы извлеченные из вашего изображения.

Pysimplegui делает это защелком, так как вы можете объединить новые элементы для вашего Элементы список.

Как только это все сделано, вы добавляете Элементы к вашему Окно Отказ

Последний кусок головоломки следующий:

    while True:
        event, values = window.read()
        if event == "Exit" or event == sg.WIN_CLOSED:
            break
        if event == "load":
            image_path = Path(values["load"])
            exif_data = get_exif_data(image_path.absolute())
            for field in fields:
                if field == "File name":
                    window[field].update(image_path.name)
                elif field == "File size":
                    window[field].update(image_path.stat().st_size)
                else:
                    window[field].update(exif_data.get(field, "No data"))


if __name__ == "__main__":
    main()

Здесь у вас есть цикл вашего мероприятия. Когда пользователь нажимает кнопку «Загрузить данные изображения», событие устанавливается на «нагрузку». Здесь вы загружаете выбранный путь изображения в Python’s pathlib Отказ Это позволяет вынуть имя файла, абсолютный путь и размер файла, используя ваш Путь Функции и атрибуты объекта.

Вы используете словарь Получить () способ получить поле. Если поле не в словаре, то вы отображаете «Нет данных» для этого поля.

Если вы хотели бы небольшой вызов, попробуйте добавить SG.Image () Элемент для этого графического интерфейса, чтобы вы могли просматривать фотографию вместе с ее метаданными!

Обертывание

Теперь вы знаете, как анализировать теги EXIF из изображения. Вы также узнали, как создать простой графический интерфейс, используя Pysimplegui. Общее количество строк для этого графического интерфейса было всего 84! Вы можете создать функциональную графику, не требуя записи сотен строк кода.

Подушка может сделать намного больше, чем только данные извлечения exif. Проверьте это и посмотрите, что еще вы можете сделать!

Связанное чтение

  • Получение GPS EXIF Данные с Python
  • Получение фото метаданных (EXIF) с помощью Python