为什么GC不处理图像

时间:2016-08-18 06:52:49

标签: c# opencv garbage-collection

我在c#中从OpenCV Emgu获取帧,一段时间后我的内存耗尽。当我手动处理旧框架时,问题消失了。这种接缝只有在我从Emgu获得帧时才会发生。如果我从AForge获得帧,例如它会按预期清理。

由于我在CopyToNewBPP中复制数据并从捕获中处理帧,因此应该释放非托管内存。当我在图片框中设置一个新的位图时,应该没有对旧框架的引用。

问题是我理解中缺少的东西。

private void button1_Click(object sender, EventArgs e)
    {
        Capture capture = new Capture("rtsp://192.168.0.89:554/live2.sdp");

        Task t = new Task(() =>
        {
            DateTime last = DateTime.Now;
            while (true)
            {
                var frame = capture.QueryFrame();
                if (frame == null)
                {
                    continue;
                }

                Bitmap bitmap = CopyToNewBPP((Bitmap)frame.Bitmap);
                frame.Dispose();

                pictureBox1.Invoke(new MethodInvoker(() =>
                {
                    var old = pictureBox1.Image;
                    pictureBox1.Image = bitmap;
                    if (old != null)
                    {
                        old.Dispose(); // this should be done automatically by GC in my mind
                    }
                }));
                frame.Dispose();
            }
        });
        t.Start();
    }

    public Bitmap CopyToNewBPP(Bitmap orig, PixelFormat format = PixelFormat.Format32bppRgb)
    {
        Bitmap clone = new Bitmap(orig.Width, orig.Height, format);
        using (Graphics gr = Graphics.FromImage(clone))
        {
            gr.DrawImage(orig, new Rectangle(0, 0, clone.Width, clone.Height));
        }
        return clone;
    }

1 个答案:

答案 0 :(得分:0)

我不知道我的回答是否有帮助

Image Gui程序对记忆舔很重要。

例如代码。

if(pictureBox.Image != null)
{
   pictureBox.Image.Dispose();
   pictureBox.Image = null;
   pictureBox.Image = [New Image];
}