如何将EXIF /其他元数据插入存储缓冲区中存储的JPEG中?

时间:2019-06-21 08:48:54

标签: python opencv python-imaging-library jpeg exif

我已经使用Python OpenCV创建了JPEG,在此过程中EXIF数据丢失了,并且在调用imwrite时显然无法重新添加(参考:Can't keep image exif data when editing it with opencv in python)。

两个问题:

  1. 通常,如何将原始EXIF数据/新的自定义元数据写入内存中而不是文件中的JPEG中?

  2. 枕头/ PIL是否能够维护EXIF数据并允许添加补充元数据?截至2013年(参考:how maintain exif data of images resizes using PIL),这似乎是不可能的,除非通过tmp文件(对我而言这不是一个选择)。

一如既往的感谢

1 个答案:

答案 0 :(得分:4)

我不确定我了解您要做什么,但是我认为您正在尝试使用OpenCV处理图像,然后重新插入在OpenCV打开图像时丢失的EXIF数据...

因此,希望您可以做已经做的事情,而且还可以使用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使用该顺序而不是OpenCV的BGR频道排序。

关键字:Python,OpenCV,PIL,Pillow,EXIF,保存,插入,复制,传输,图像,图像处理,图像处理,dict,BytesIO,内存,内存中,缓冲区