Как вытащить медиатеги создания/изменения фотографии и занести в новую фотографию?

Пробовал разное, но никак.. Вот например из того что пробовал.

def update_exif_datetime(image_path, new_datetime):
    try:
        # Открываем изображение
        image = Image.open(image_path)

        # Получаем Exif данные
        exif = image.getexif()
        exif['DateTimeOriginal'] = new_datetime
        print(exif)

        if exif is not None:
            print(exif)
            # Сохраняем изображение с обновленными Exif данными
            image.save(image_path, exif=exif['DateTimeOriginal'])
            print(f"Изображение {image_path} сохранено с новыми Exif данными.")
        else:
            print(f"Exif данные отсутствуют для файла {image_path}.")
    except Exception as e:
        print(f"Ошибка при обработке файла {image_path}: {e}")

Вот сам код в котором должно быть все

import asyncio
from tkinter import filedialog, Tk
from PIL import Image, ExifTags
import exifread
import io
import os

# Функция для обработки одного файла
async def process_file(file_path):
    try:
        with open(file_path, 'rb') as f:
            tags = exifread.process_file(f)
        
        if 'JPEGThumbnail' in tags.keys():
            thumbnail_data = tags['JPEGThumbnail']
            # datetime_data = tags['Image DateTime'].printable
            thumbnail_img = Image.open(io.BytesIO(thumbnail_data))
            
            # Получаем базовое имя файла без расширения
            base_name = os.path.basename(file_path)
            file_name_without_ext = os.path.splitext(base_name)[0]
            
            # Используем абсолютный путь к корневой директории проекта для сохранения превью
            project_root = os.getcwd()  # Получаем путь к текущей рабочей директории
            thumbnail_dir = os.path.join(project_root, "thumbnails")
            thumbnail_path = os.path.join(thumbnail_dir, file_name_without_ext + ".jpg")
            
            # Создаем директорию для превью, если она еще не существует
            os.makedirs(thumbnail_dir, exist_ok=True)
            
            # Сохраняем превью
            thumbnail_img.save(thumbnail_path)
            
            print(f"Превью успешно сохранено по пути: {thumbnail_path}")
        else:
            print("Превью не найдено в изображении.")
    except Exception as e:
        print(f"Ошибка при обработке файла {file_path}: {e}")

# Асинхронная функция для выбора и обработки нескольких файлов
async def extract_embedded_thumbnails():
    root = Tk()
    root.withdraw()
    file_paths = filedialog.askopenfilenames(title="Выберите изображения", filetypes=[("Image files", "*.png;*.jpg;*.jpeg;*.gif;*.bmp;*.ico")])
    
    if file_paths:
        await asyncio.gather(*(process_file(path) for path in file_paths))
    else:
        print("Файлы не выбраны.")

# Запуск асинхронной функции
if __name__ == "__main__":
    asyncio.run(extract_embedded_thumbnails())


Ответы (1 шт):

Автор решения: Merrcurys

Нашел решение

if 'JPEGThumbnail' in tags.keys():
            thumbnail_data = tags['JPEGThumbnail'] # Вытаскиваем не побитое превью
            thumbnail_img = Image.open(io.BytesIO(thumbnail_data))
            
            # Получаем базовое имя файла без расширения
            base_name = os.path.basename(file_path)
            file_name_without_ext = os.path.splitext(base_name)[0]
            
            # Используем абсолютный путь к корневой директории проекта для сохранения превью
            project_root = os.getcwd()  # Получаем путь к текущей рабочей директории
            thumbnail_dir = os.path.join(project_root, "thumbnails")
            thumbnail_path = os.path.join(thumbnail_dir, file_name_without_ext + ".jpg")
            
            # Создаем директорию для превью, если она еще не существует
            os.makedirs(thumbnail_dir, exist_ok=True)

            # Вытаскиваем старые метатеги
            image = Image.open(file_path)
            exif = image.info.get('exif')
            # Сохраняем превью
            if exif is None:
                thumbnail_img.save(thumbnail_path)
                print("Метатеги не были найдены у оригинальной фотографии.")
            else:
                thumbnail_img.save(thumbnail_path, exif=exif)
→ Ссылка