程序場景:一系列的圖片,從第一張到最後一張依次加載圖片,形成“動畫”。
生成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; } }
本欄目