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

2024-04-05

我使用 Python OpenCV 创建了一个 JPEG,EXIF 数据在此过程中丢失,并且在调用 imwrite 时显然无法重新添加(参考:在python中使用opencv编辑图像时无法保留图像exif数据 https://stackoverflow.com/questions/50276424/cant-keep-image-exif-data-when-editing-it-with-opencv-in-python).

两个问题:

  1. 一般来说,如何将原始 EXIF 数据/新的自定义元数据写入存在于内存而不是文件中的 JPEG 中?

  2. Pillow/PIL 是否能够维护 EXIF 数据并允许添加补充元数据?截至2013年(参考:如何使用PIL维护图像调整大小的exif数据 https://stackoverflow.com/questions/17061222/how-maintain-exif-data-of-images-resizes-using-pil)这似乎不可能,除非通过 tmp 文件(这对我来说不是一个选项)。

一如既往地感谢


我不确定我明白你想要做什么,但我认为你正在尝试使用 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)转到 PIL 使用的传统 RGB 通道排序,而不是 OpenCV 的 BGR 通道排序。

Keywords:Python、OpenCV、PIL、Pillow、EXIF、保留、插入、复制、传输、图像、图像处理、图像处理、dict、BytesIO、内存、内存中、缓冲区。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 EXIF/其他元数据插入到存储在内存缓冲区中的 JPEG 中? 的相关文章

随机推荐