如何将原图片的EXIF数据转移到编辑处理后的新图片中
解决方案
你当前的实现仅向Jpeg编码器传入了处理后的像素数据,未携带原图像的EXIF元数据,因此导出的新图片会丢失所有EXIF信息。
你只需要调整原图加载逻辑,提取原图像的元数据后传入新生成的帧即可,修改后的完整代码如下:
void FixFile(string path) { // 先加载原图帧,提取包含EXIF的元数据、缩略图、色彩上下文等信息 var originalFrame = BitmapFrame.Create(new Uri(path)); var bmp = new WriteableBitmap(originalFrame); bmp.Lock(); // 原有伪影修复逻辑 // magick bmp.Unlock(); using (var stream = new FileStream(path.Replace("DSC", "fix_DSC"), FileMode.Create)) { var encoder = new JpegBitmapEncoder(); // 生成新帧时传入原图像的元数据、缩略图、色彩配置 encoder.Frames.Add(BitmapFrame.Create(bmp, originalFrame.Thumbnail, originalFrame.Metadata, originalFrame.ColorContexts)); encoder.Save(stream); } }
注意事项
- 如果需要修改EXIF内容,不要直接操作原
originalFrame.Metadata,先克隆为可写的元数据对象:var editableMetadata = (BitmapMetadata)originalFrame.Metadata.Clone(); // 可通过SetQuery方法修改对应EXIF字段 // 例:修改拍摄时间 editableMetadata.SetQuery("/app1/ifd/exif/{ushort=36867}", "2024:05:20 14:30:00"); // 之后将editableMetadata传入新BitmapFrame即可 - 该方法可以完整保留原图像的所有EXIF信息、缩略图、色彩配置,不会额外丢失其他元数据。
内容的提问来源于stack exchange,提问作者yadda
相关产品推荐
相关产品推荐

