WPF:修改映像(BitmapSource類型)的中繼資料

來源:互聯網
上載者:User

簡而言之首先需要擷取映像的中繼資料,接著通過設定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));

結果:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.