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;

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[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;
           }
       }

 

如果您有更好的解决办法,欢迎回复!

posted @   疯狂的懒羊羊  阅读(7281)  评论(20编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示