我已经使用Python OpenCV创建了JPEG,在此过程中EXIF数据丢失了,并且在调用imwrite时显然无法重新添加(参考:Can't keep image exif data when editing it with opencv in python)。
两个问题:
通常,如何将原始EXIF数据/新的自定义元数据写入内存中而不是文件中的JPEG中?
枕头/ PIL是否能够维护EXIF数据并允许添加补充元数据?截至2013年(参考:how maintain exif data of images resizes using PIL),这似乎是不可能的,除非通过tmp文件(对我而言这不是一个选择)。
一如既往的感谢
答案 0 :(得分:4)
我不确定我了解您要做什么,但是我认为您正在尝试使用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)
转到常规的RGB通道顺序,PIL使用该顺序而不是OpenCV的BGR频道排序。
关键字:Python,OpenCV,PIL,Pillow,EXIF,保存,插入,复制,传输,图像,图像处理,图像处理,dict,BytesIO,内存,内存中,缓冲区