WPF圖片的縮放節省內存


一、前言

  正好項目用到要加載大量圖片,雖然說可以使用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;//原圖的高
                }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM