WPF循環加載圖片導致內存溢出的解決辦法


程序場景:一系列的圖片,從第一張到最后一張依次加載圖片,形成“動畫”。

 

生成BitmapImage的方法有多種:

 

1、

var source=new BitmapImage(new Uri("圖片路徑",UriKind.xxx));

一般的場景使用這種方法還是比較方便快捷,但是對於本場景,內存恐怕得爆。

 

2、

var data =File.ReadAllBytes("圖片路徑");

var ms = new System.IO.MemoryStream(data);
var source = new BitmapImage();
source.BeginInit();
source.CacheOption = BitmapCacheOption.OnLoad;
source.StreamSource = ms;
source.EndInit();
source.Freeze();
ms.Close();
return source;

此方法基本可行,但有時也會不靈光,例如在調用高清攝像頭的時候。

高清的攝像頭一般都會提供SDK,可以獲取到圖像數據byte[],使用以上的方法有可能還會導致內存溢出。

可以使用以下這種方法試試:

//用Bitmap來轉換,可以刪除Bitmap的句柄來釋放資源
var ms = new System.IO.MemoryStream(data);
var bmp = new System.Drawing.Bitmap(ms);
var source = ToBitmapSource(bmp);
ms.Close();
bmp.Dispose();
return source;

 

 [DllImport("gdi32.dll", SetLastError = true)]
        private static extern bool DeleteObject(IntPtr hObject);

        private BitmapSource ToBitmapSource(System.Drawing.Bitmap bmp)
        {
            try
            {
                var ptr = bmp.GetHbitmap();
                var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                    ptr, IntPtr.Zero, Int32Rect.Empty,  System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
                DeleteObject(ptr);
                return source;
            }
            catch
            {
                return null;
            }
        }

 

如果您有更好的解決辦法,歡迎回復!


免責聲明!

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



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