WPF圖片的縮放節省記憶體
阿新 • • 發佈:2021-12-14
一、前言
正好專案用到要載入大量圖片,雖然說可以使用WPF提供的自帶的UI虛擬化功能,但是直接載入大量的圖片到記憶體還是會
消耗很多的記憶體,而且WPF支援UI虛擬化的ListBox等容器的佈局是VirtualizingStackPanel,這個對圖片多樣化的展示支援就
夠嗆了,這個佈局的話可以自己重新寫個虛擬佈局管理器,這不是本節的內容,本節要討論的在WPF下的圖片縮圖的問題。
在網上一搜一大把都是Winform下的圖片縮放,其實在WPF下實現圖片的縮放也是非常簡單的。
二、WPF實現縮圖
WPF下圖片的處理也是非常到位的,有很多的圖片相關的處理類,如圖片的編碼解碼包括裁剪圖片啥的,都有。
WPF圖片的顯示主要靠BitmapSource,這是個抽象類,有好幾個實現類的。本文說的就是BitmapImage,從本地載入圖片:
BitmapImage bit = new BitmapImage(); using (FileStream fs = new FileStream(@"D:\Pictures\back.jpg", FileMode.Open)) { fs.Seek(0, SeekOrigin.Begin); bit.BeginInit(); bit.CreateOptions = BitmapCreateOptions.IgnoreColorProfile; bit.CacheOption = BitmapCacheOption.OnLoad; bit.DecodePixelWidth = 300;//需要縮圖的解碼寬度 bit.DecodePixelHeight = (int)(bit.DecodePixelWidth * 0.625);//縮圖的解碼高度 bit.StreamSource = fs; bit.EndInit(); } img1.Source = bit;
如上,便是生成縮圖的關鍵。可以自行對比縮圖和原始圖佔用記憶體的情況,甚至可以儲存下來對比。
當然如果想要等比例的縮放圖片,可以嘗試BitmapDecoder提前獲取原圖片的寬高,然後進行等比例縮放:
{ var decoder = BitmapDecoder.Create(fs, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad); var thumnail = decoder.Thumbnail;var frame = decoder.Frames[0]; var raww = frame.Width;//原圖的寬 var rawh = frame.Height;//原圖的高 }