如何保留已编辑图像的 EXIF?

How to keep EXIF of an edited image?

所以我的程序正在修复一些图像伪像,它是这样的:

void FixFile(string path)
{
    var bmp = new WriteableBitmap(new BitmapImage(new Uri(path)));
    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));
        encoder.Save(stream);
    }
}

问题是固定图像不包含 EXIF 数据。如何从原始图像传输 EXIF 数据?

将源位图加载为 BitmapFrame,而不是 BitmapImage。然后将源的 Metadata 属性 传递给添加到编码器的 Frames 集合中的新 BitmapFrame

public void FixFile(string path)
{
    var source = BitmapFrame.Create(new Uri(path));
    var metadata = (BitmapMetadata)source.Metadata;

    var bmp = new WriteableBitmap(source);
    bmp.Lock();
    // magick
    bmp.Unlock();

    var target = BitmapFrame.Create(bmp, null, metadata, null); // here

    var encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(target);

    using (var stream = File.OpenWrite(path.Replace("DSC", "fix_DSC")))
    {
        encoder.Save(stream);
    }
}