程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WPF循環加載圖片導致內存溢出如何解決

WPF循環加載圖片導致內存溢出如何解決

編輯:關於.NET

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

生成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;  
           }  
       }

本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved