C# WPF 处理 Image 对象

Posted

技术标签:

【中文标题】C# WPF 处理 Image 对象【英文标题】:C# WPF dispose of Image object 【发布时间】:2013-06-30 04:47:59 【问题描述】:

我捕获屏幕,然后将图像数据保存到内存流中,以便将其设置为 BitmapImage 对象。

bmp = new System.Drawing.Bitmap((int)sel.rectSelectedArea.Width, (int)sel.rectSelectedArea.Height);
bounds = new System.Drawing.Rectangle((int)sel.rectSelectedArea.X, (int)sel.rectSelectedArea.Y, (int)sel.rectSelectedArea.Width, (int)sel.rectSelectedArea.Height);

using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp))
    g.CopyFromScreen(new System.Drawing.Point(bounds.Left, bounds.Top), System.Drawing.Point.Empty, bounds.Size);

ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.Position = 0;

frames.Add(new BitmapImage());
frames.Last().BeginInit();
frames.Last().StreamSource = ms;
frames.Last().EndInit();
frames.Last().Freeze();

然后当我需要向用户显示该框架时。我将选定的帧设置为 Image 对象的 Source。

imgExample.Source = frames[targetFrame];

问题是当我向用户显示另一个框架时。前一帧仍保留在内存中,因此在大约 200 帧后,它会累积 3-600,000 K 的内存,它永远不会释放。

有没有一种方法可以让 imgExample(图像对象)立即释放内存? 或者是否有一种方法可以覆盖相同的内存而不是为所有帧创建新对象。

【问题讨论】:

我喜欢你将恐龙 System.Drawing 的东西带入 WPF 的方式。 你可以试试 WriteableBitmap - 这些很容易随时更新。 【参考方案1】:
bmp.Dispose();
bmp = null;

GC.Collect();

【讨论】:

我需要保留 BMP 以显示帧,但我需要它在不显示时并不总是在内存中。 那么,您想保留 BMP... 但不在内存中?比如说,通过将其写入磁盘?

以上是关于C# WPF 处理 Image 对象的主要内容,如果未能解决你的问题,请参考以下文章

wpf显示视频,image控件闪屏,使用winform控件实现

值转换器 WPF中Image数据绑定Icon对象

WPF中显示System.Drawing.Image对象,怎么办?急急急

关于在 C# (WPF) 中对 COM 对象进行异步调用的问题

C#已有的Image对象(内存图片)如何改变高宽?

C#如何得到一个Image对象所占的字节数?