清除WPF中的内存

3

我正在进行一个项目,从kinect捕获帧并对它们进行实时处理,我需要显示位图,因此我将它们转换为bmapsource并传递给image.source:

Bitmap bmap = new Bitmap(640, 480, System.Drawing.Imaging.PixelFormat
                                                     .Format24bppRgb);

BitmapSource bmapSource= System.Windows.Interop.Imaging.
  CreateBitmapSourceFromHBitmap(bmap.GetHbitmap(),IntPtr.Zero, Int32Rect.Empty, 
                                BitmapSizeOptions.FromEmptyOptions());
image.source = bmapSource;

但是在2分钟后,当我处理15FPS时,对于这部分内容,我会收到“内存不足”的错误提示。是否有任何方法可以在每个处理后清除内存?还是有其他方法可以在WPF中显示Bmap?

提前感谢您的帮助 :)


1个回答

0

试试这个:

            [System.Runtime.InteropServices.DllImport("gdi32.dll")]
            public static extern bool DeleteObject(IntPtr hObject);
            IntPtr bmp;
{
                if (bmp != null)
                {
                    DeleteObject(bmp);
                }
                Bitmap bmap = new Bitmap(640, 480, System.Drawing.Imaging.PixelFormat
                                                         .Format24bppRgb);
                bmp = bmap.GetHbitmap();
                BitmapSource bmapSource = System.Windows.Interop.Imaging.
                  CreateBitmapSourceFromHBitmap(bmp, IntPtr.Zero, Int32Rect.Empty,
                                                BitmapSizeOptions.FromEmptyOptions());
                bmap.Dispose();
                bmap = null;

                image.Source = bmapSource;
}

亲爱的Yushulx,感谢您的帮助,但我对这段代码有点困惑,您能否给我一些注释呢?您正在填充获取到的帧的哪个部分,我的意思是您从Kinect获取的图像或帧?我有一个结果图像,它是位图,我想在image.source中显示它。 - Niloufar
抱歉,我没有表达清楚。我应该将代码块分开。括号外的代码应该在你的类中全局声明。而括号内的代码则是用于你的实现。我没有对Kinect捕获做任何处理,只是在我的事件中尝试了一下。所以我所做的就是释放了两份数据。其中一份是位图,你可以使用dispose来释放它。另一份是从bitmap.gethbitmap复制的副本。你应该使用DeleteObject来释放它。所以试一试吧。希望能够成功 :) - yushulx
IntPtr bmp用于保存位图句柄,并在尝试绘制从Kinect捕获的新帧之前释放它。确保您的图像源只有一个副本,并释放其他无用内存。该位图未受管理,您必须手动释放它。 - yushulx
亲爱的Yushulx,感谢您的帮助,但是我仍然遇到了内存不足的问题,现在出现在您的代码的一部分,bmp = bmap.GetHbitmap();。 - Niloufar
当您从Kinect接收新帧或停止接收帧时,必须通过DeleteObject(bmp)释放内存。 - yushulx
是的,我正在做那个,它在你的解决方案中。但问题仍然存在。 - Niloufar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接