You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用cv2为PNG/JPG存储字符串元数据并后续读取?

如何用OpenCV(cv2)给PNG/JPG图片添加并读取字符串元数据

OpenCV的cv2.imwrite和cv2.imread本身不支持直接操作图像元数据,需要结合专门处理图像元数据的第三方库来实现。以下分格式给出具体方案:

一、JPG文件:利用EXIF元数据

JPG原生支持EXIF标准,可通过第三方库将自定义元数据写入EXIF的UserComment字段,后续读取该字段即可获取内容。

方案:使用piexif库

先安装依赖:

pip install piexif

完整代码:

import cv2
import numpy as np
import piexif

# 生成示例图像
x = np.array([[[0, 0, 255], [0, 255, 0], [255, 0, 0]],
              [[0, 0, 255], [0, 255, 0], [255, 0, 0]],
              [[0, 0, 255], [0, 255, 0], [255, 0, 0]]])

metadata = "gain: 0.12345"

# 保存临时JPG,再添加EXIF元数据
cv2.imwrite("x_temp.jpg", x)
# 加载现有EXIF(无则创建空字典)
exif_dict = piexif.load("x_temp.jpg")
# 将元数据写入UserComment字段(需转字节格式)
exif_dict["Exif"][piexif.ExifIFD.UserComment] = metadata.encode('utf-8')
# 生成EXIF字节并插入到目标JPG
exif_bytes = piexif.dump(exif_dict)
piexif.insert(exif_bytes, "x_temp.jpg", "x.jpg")

# 读取JPG的元数据和图像内容
exif_read = piexif.load("x.jpg")
retrieved_metadata = exif_read["Exif"][piexif.ExifIFD.UserComment].decode('utf-8')
print("从JPG读取的元数据:", retrieved_metadata)

z = cv2.imread("x.jpg")
print("JPG图像内容:\n", z)

二、PNG文件:利用tEXt私有块

PNG不支持EXIF,但可通过tEXt私有块存储自定义元数据,推荐用Pillow库实现(同时兼容JPG处理)。

方案:使用Pillow库

先安装依赖:

pip install pillow

完整代码:

import cv2
import numpy as np
from PIL import Image
from PIL.PngImagePlugin import PngInfo

# 生成示例图像
x = np.array([[[0, 0, 255], [0, 255, 0], [255, 0, 0]],
              [[0, 0, 255], [0, 255, 0], [255, 0, 0]],
              [[0, 0, 255], [0, 255, 0], [255, 0, 0]]])

metadata = "gain: 0.12345"

# --- 处理JPG ---
# 将cv2的BGR图像转成PIL的RGB格式
pil_img = Image.fromarray(cv2.cvtColor(x, cv2.COLOR_BGR2RGB))
# 添加EXIF元数据(0x9286对应UserComment标签)
exif = pil_img.getexif()
exif[0x9286] = metadata
pil_img.save("x.jpg", exif=exif)

# 读取JPG
pil_jpg = Image.open("x.jpg")
retrieved_jpg_meta = pil_jpg.getexif().get(0x9286)
print("JPG元数据:", retrieved_jpg_meta)
# 转回cv2格式
z = cv2.cvtColor(np.array(pil_jpg), cv2.COLOR_RGB2BGR)
print("JPG图像内容:\n", z)

# --- 处理PNG ---
# 创建PNG元数据对象并添加自定义字段
png_info = PngInfo()
png_info.add_text("CustomMetadata", metadata)
pil_img.save("x.png", pnginfo=png_info)

# 读取PNG
pil_png = Image.open("x.png")
retrieved_png_meta = pil_png.text.get("CustomMetadata")
print("PNG元数据:", retrieved_png_meta)
# 转回cv2格式
y = cv2.cvtColor(np.array(pil_png), cv2.COLOR_RGB2BGR)
print("PNG图像内容:\n", y)

内容的提问来源于stack exchange,提问作者Basj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:45:01