Как я могу вставить EXIF ​​/ другие метаданные в JPEG, хранящийся в буфере памяти? - PullRequest
3 голосов
/ 21 июня 2019

Я создал JPEG с использованием Python OpenCV, данные EXIF ​​теряются в процессе и, очевидно, не могут быть повторно добавлены при вызове imwrite (ссылка: Не удается сохранить данные exif изображения при редактировании с помощью opencvв Python ).

Два вопроса:

  1. В общем, как я могу записать исходные данные EXIF ​​/ новые пользовательские метаданные в JPEG, который существует в памятиа не файл?

  2. Может ли подушка / PIL поддерживать данные EXIF ​​и разрешать добавление дополнительных метаданных?По состоянию на 2013 год (ссылка: , как поддерживать exif-данные изображений, изменяющих размеры с использованием PIL ), это казалось невозможным, кроме как через файл tmp (что для меня не вариант).

Спасибо как всегда

1 Ответ

4 голосов
/ 21 июня 2019

Я не уверен, что понимаю, что вы пытаетесь сделать, но я думаю, что вы пытаетесь обработать изображение с помощью OpenCV, а затем заново вставить данные EXIF, которые вы потеряли, когда OpenCV открыл его ...

Итак, мы надеемся, что вы можете делать то, что вы уже делаете, но также открыть изображение с помощью PIL / Pillow и извлечь данные EXIF, а затем записать их в изображение, обработанное OpenCV.

from PIL import Image
import io

# Read your image with EXIF data using PIL/Pillow
imWithEXIF = Image.open('image.jpg')

Теперь у вас будет диктовка с информацией EXIF ​​в:

imWIthEXIF.info['exif']

Теперь вы хотите записать данные EXIF ​​в ваше изображение, которое вы обработали с помощью OpenCV, поэтому:

# Make memory buffer for JPEG-encoded image
buffer = io.BytesIO()

# Convert OpenCV image onto PIL Image
OpenCVImageAsPIL = Image.fromarray(OpenCVImage)

# Encode newly-created image into memory as JPEG along with EXIF from other image
OpenCVImageAsPIL.save(buffer, format='JPEG', exif=imWIthEXIF.info['exif']) 

Осторожно ... В приведенном выше коде я предполагаю, что OpenCVImage - это массив Numpy, и вы вызвали cvtColor(cv2.COLOR_BGR2RGB), чтобы перейти к обычному упорядочиванию каналов RGB, которое использует PIL, а не упорядочение каналов BGR OpenCV.

Ключевые слова : Python, OpenCV, PIL, Pillow, EXIF, сохранение, вставка, копирование, передача, изображение, обработка изображений, обработка изображений, dict, BytesIO, память, оперативная память, буфер.

...