如何使用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
相关产品推荐
相关产品推荐

