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

程序場景:一系列的圖片,從第一張到最後一張依次加載圖片,造成「動畫」。動畫

 

生成BitmapImage的方法有多種:blog

 

一、圖片

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

通常的場景使用這種方法仍是比較方便快捷,可是對於本場景,內存恐怕得爆。資源

 

二、it

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

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;ast

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

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

能夠使用如下這種方法試試:

//用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;
            }
        }

 

若是您有更好的解決辦法,歡迎回復!

相關文章
相關標籤/搜索