簡而言之首先需要擷取映像的中繼資料,接著通過設定BitmapFrame.Metadata屬性,然後用BitmapEncoder儲存圖片。
這裡有些細節需要注意,首先如果使用BitmapFrame.Create(BitmapSource)方法初始化BitmapFrame:
BitmapFrame.Create(new BitmapImage(new Uri(@"C:\Users\Mgen\Desktop\a.jpg")));
此時該BitmapFrame是不包含中繼資料的,Metadata屬性會返回null。
因此擷取映像中繼資料必須用BitmapDecoder,通過BitmapDecoder.Frames中的BitmapFrame.Metadata來擷取中繼資料。
其次如果直接修改擷取的BitmapMetadata對象,會拋出異常:(Specified value of type 'System.Windows.Media.Imaging.BitmapMetadata' must have IsFrozen set to false to modify.),原因是BitmapMetadata類型也屬於Freezable類型,依然IsFrozen為True,自然不能修改了。可以通過Clone方法來複製一個IsFrozen為False的自然可以被修改的Freezable對象。
瞭解了上面的資訊,原始碼就好理解了,代碼:
//源檔案
var src = @"C:\Users\Mgen\Desktop\a.jpg";
//儲存檔案
var dest = @"C:\Users\Mgen\Desktop\b.jpg";
//建立BitmapEncoder
var bitmapEncoder = new JpegBitmapEncoder();
//建立BitmapDecoder
var bitmapDecoder = new JpegBitmapDecoder(new Uri(src), BitmapCreateOptions.None, BitmapCacheOption.Default);
//擷取中繼資料(BitmapMetadata對象)
var frame = bitmapDecoder.Frames[0];
//複製可以修改的Freezable對象
var metadata = (BitmapMetadata)frame.Metadata.Clone();
//修改中繼資料
metadata.CameraManufacturer = "Mgen!";
//建立用於BitmapDecoder的新的BitmapFrame
var newFrame = BitmapFrame.Create(frame, frame.Thumbnail, metadata, frame.ColorContexts);
//添加BitmapFrame
bitmapEncoder.Frames.Add(newFrame);
//儲存檔案
bitmapEncoder.Save(System.IO.File.OpenWrite(dest));
結果: