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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:24:33