Обновление комментариев метаданных в файле png на Python

#python #pandas #python-imaging-library #piexif

Вопрос:

Я пытаюсь обновить комментарии метаданных(Подробности -> Описание ->> Комментарии) в файлах изображений(формат jpg) для группы изображений в каталоге на основе определенных критериев. Комментарии к метаданным имеют строковые значения, разделенные пробелами. Пример комментария к метаданным — «ABC 123 07-04-21» и т.д. Пожалуйста, посмотрите прилагаемую фотографию.

введите описание изображения здесь

Я получаю кучу файлов изображений и комментариев в файле csv, хранящемся в том же каталоге, что и изображения. Мне нужно сопоставить имена файлов изображений с файлами, находящимися в каталоге, и обновить комментарии из файла csv к комментариям метаданных изображений(Подробности -> Описание ->> Комментарии).

Я попробовал несколько вещей. Удалось узнать, как обновлять комментарии в файле jpg, хотя это работает для одного изображения.

Фрагмент кода для обновления комментариев в одном файле JPG. Кодирование имеет важное значение для фактического просмотра обновленных комментариев в файле jpg.

 im = Image.open("20210430.jpg")
exif_dict["0th"][piexif.ImageIFD.XPComment] = "Test comments 12345".encode('utf-16le')
exif_bytes = piexif.dump(exif_dict)
im.save("20210430.jpg.jpg", exif=exif_bytes)
 

Несколько вещей, которые я пробовал:

 from PIL import Image
import piexif
import pandas as pd
import glob
import os


--dataframe to store list of image file names and comments to update.

df1= pd.read_csv('FinalImageMetaData.csv')

--dataframe which has list of images file names in the directory.

df2=pd.read_csv('ListImage.csv')

merged_inner = pd.merge(left=df2, right=df1, left_on='IMAGE_NAME', right_on='IMAGE_NAME')

#merged_inner[['METADATA']]

images = glob.glob(r"C:..Programs*.jpg")

for image in images:

     with open(image, 'rb') as file:

        img = Image.open(file)

        exif_dict = piexif.load(img.info["exif"])

        exif_dict["0th"][piexif.ImageIFD.XPComment] = merged_inner[['METADATA']].encode('utf-16le')
        exif_bytes = piexif.dump(exif_dict)

        img.save(file, exif=exif_bytes)
        
 

Пример содержимого файла FinalImageMetaData.csv

 IMAGE_NAME,METADATA

20210430.jpg,12345 02/27/2021 00:00:00   
20210429.jpg,34567 02/27/2021 00:00:00   
20210428.jpg,90897 02/27/2021 00:00:00   
20210427.jpg,56789 02/27/2021 00:00:00   
20210426.jpg,34567 02/27/2021 00:00:00
 

Пример содержимого файла ListImage.csv

 IMAGE_NAME

20210430.jpg

20210429.jpg

20210428.jpg

20210427.jpg

20210426.jpg

20210425.jpg

20210424.jpg

20210423.jpg

20210422.jpg
 

Пожалуйста, поделитесь любыми идеями/фрагментами кода.

Комментарии:

1. Так в чем же твоя проблема ? Что происходит, когда вы запускаете свой код ?

2. @joao ничего не происходит. Изображения не обновляются никакими комментариями из сопоставленных данных между CSV.

3. Вам следует добавить несколько print команд, чтобы увидеть, что происходит, возможно, распечатать имя файла изображения и текстовую строку, которую вы задаете в качестве комментария.

4. Сейчас я пытался сделать что-то подобное. Он выдает ошибку AttributeError: объект «Фрейм данных» не имеет ошибки «кодирования» атрибута. изображения = глоб.глоб(r»C:..Programs*.jpg») для изображения в изображениях: img = Изображение.открыть(изображение) exif_dict[«0-й»][piexif. ImageIFD.XPComment] = merged_inner[[‘МЕТАДАННЫЕ’]]. кодировать(‘utf-16le’) exif_bytes = piexif.дамп(exif_dict) img.сохранить(файл, exif=exif_bytes)