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

Posted

技术标签:

【中文标题】如何将 EXIF/其他元数据插入存储在内存缓冲区中的 JPEG 中?【英文标题】:How can I insert EXIF/other metadata into a JPEG stored in a memory buffer? 【发布时间】:2019-11-04 02:21:47 【问题描述】:

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

两个问题:

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

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

一如既往的感谢

【问题讨论】:

您在内存中有一个 JPEG 文件的缓冲区,它以 JPEG 标头 0xff 0xd8 开头,您想在内存中编辑它以添加一些 EXIF 数据? @MarkSetchell 正确 - 这很简单吗? 我的回答解决了你的问题吗?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步为您提供帮助。谢谢。 meta.stackexchange.com/questions/5234/… 【参考方案1】:

我不确定我是否理解您要执行的操作,但我认为您正在尝试使用 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 通道排序。

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

【讨论】:

啊,就这么简单,非常感谢!用例很到位 - 如果标准支持,还需要添加任意 EXIF 标签的能力。

以上是关于如何将 EXIF/其他元数据插入存储在内存缓冲区中的 JPEG 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在lua中获取webp图像EXIF元数据?

如何通过 graphicsmagick 命令编辑 exif 元数据?

如何在不加载图像的情况下为文件系统上的现有图像写入或修改 EXIF 数据?

Javascript:如何将 exif 日期时间数据转换为时间戳? [复制]

错误地将 EXIF 元数据写入图像

如何将数据从资源指针存储到 C++ 中的静态内存缓冲区?