Python OpenCV处理图像后如何复制原图EXIF数据到修改后图像
问题描述
使用Python结合OpenCV做图像处理时,按如下流程操作会出现EXIF丢失问题:
- 读取原图代码:
img=cv2.imread('orig.jpg')
- 完成图像修改后,保存处理结果:
cv2.imwrite('modi.jpg', img)
OpenCV的imwrite方法默认不会携带原图的EXIF元数据,保存后的modi.jpg会丢失全部EXIF信息。
之前尝试使用EXIF 1.3.5库实现EXIF跨图复制,测试代码如下:
with open('orig.jpg', 'rb') as img_file: img1 = Image(img_file) with open('modi.jpg', 'wb') as new_image_file: new_image_file.write(img1.get_file())
这段代码的问题是直接将原图的完整文件内容(包含原图的像素数据+EXIF)写入modi.jpg,会直接覆盖已经处理好的修改后图像内容,无法实现「保留modi.jpg图像内容、仅复制EXIF」的需求。
解决方案
你之前的代码逻辑错误点在于没有将图像像素数据和EXIF元数据做拆分处理,直接写入了原图的完整字节流。以下是两种可直接运行的实现方案:
方案1:使用你已安装的exif库实现
不需要额外安装依赖,核心逻辑是单独提取原图所有EXIF字段,写入到修改后图像的对象中,再保存,全程不会改动modi.jpg的像素内容:
from exif import Image # 读取原图提取全部EXIF信息 with open('orig.jpg', 'rb') as orig_f: orig_img = Image(orig_f) all_exif_tags = orig_img.all_tags() # 读取已经处理好的modi.jpg with open('modi.jpg', 'rb') as modi_f: modi_img = Image(modi_f) # 逐字段将原图EXIF写入修改后的图像对象 for tag in all_exif_tags: if hasattr(orig_img, tag): setattr(modi_img, tag, getattr(orig_img, tag)) # 保存带EXIF的最终图像 with open('modi.jpg', 'wb') as save_f: save_f.write(modi_img.get_file())
方案2:使用piexif库实现(更适配OpenCV工作流)
这个方案更轻量,甚至可以省去「先存无EXIF的图、再补EXIF」的二次读写步骤,在OpenCV保存环节直接写入EXIF。
首先安装依赖:
pip install piexif
方式A:保存OpenCV处理结果时直接写入EXIF(推荐)
import cv2 import piexif # 读取原图同时加载EXIF img = cv2.imread('orig.jpg') orig_exif = piexif.load('orig.jpg') # 此处插入你的所有OpenCV图像处理逻辑 # 例:img = cv2.resize(img, (1024, 1024)) # 保存时直接传入EXIF参数,一步生成带完整EXIF的结果图 cv2.imwrite('modi.jpg', img, exif=piexif.dump(orig_exif))
方式B:给已生成的modi.jpg补写EXIF
如果你已经生成了不带EXIF的modi.jpg,直接运行以下代码即可完成EXIF复制,不会改动图像本身内容:
import piexif # 提取原图EXIF字节流 exif_bytes = piexif.dump(piexif.load('orig.jpg')) # 将EXIF插入目标图像 piexif.insert(exif_bytes, 'modi.jpg')
内容的提问来源于stack exchange,提问作者Shahgee
相关产品推荐
相关产品推荐

