WPF循环加载图片导致内存溢出的解决办法
2014-06-06 11:05
375 查看
程序场景:一系列的图片,从第一张到最后一张依次加载图片,形成“动画”。
生成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;
如果您有更好的解决办法,欢迎回复!
生成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; } }
如果您有更好的解决办法,欢迎回复!
相关文章推荐
- android图片加载导致的OOM分析及有效解决办法(BitmapUtils)
- 解决加载大量图片导致内存溢出的三种办法http://www.360doc.com/content/13/0409/11/7857928_277107102.shtml
- 关于CCArmature加载时因为plist中含有相同名称的图片导致碰撞框被冲掉的解决办法。
- Bitmap循环加载图片出现内存不足解决办法
- wpf Image动态加载图片终极解决办法 .
- wpf Image动态加载图片终极解决办法
- 安卓加载图片过大而导致OOM内存溢出的解决方法(巨坑....)
- 使用ImageLoader+gallery加载图片导致图片哆嗦的问题解决办法
- ViewPager加载多张图片出现内存溢出的解决办法
- 引用Three20框架,如果加载网络的图片过大导致图片编译器不执行的解决办法
- ListView异步加载图片的解决办法
- ListView异步加载图片的解决办法
- WPF加载相对路径的图片的解决方法
- 加载大图片内存溢出的解决办法
- 用Bitmap加载图片资源时,报错java.lang.OutOfMemoryError: bitmap size exceeds VM budget的解决办法
- android加载大量图片内存溢出bitmap size exceeds VM budget的解决办法。
- JVM内存分析及导致内存溢出的不健壮代码及解决办法
- eclipse android 开发加载图片资源提示找不到对应名称解决办法
- 【浏览器兼容性】 IE6下背景图片默认不缓存,导致hover效果闪烁的解决办法
- JVM内存分析及导致内存溢出的不健壮代码及解决办法