【问题标题】:Disposing of Bitmaps used in background thread处理后台线程中使用的位图
【发布时间】:2013-02-21 15:37:09
【问题描述】:

我需要知道如何正确处理位图,以免出现内存泄漏。 我在 BackgroundWorker 中抓取视频并将其分配给 PictureBox:

private void bwVideo_ReadCamera(object sender, DoWorkEventArgs e)
{
  Bitmap temp = null;
  while (true)
  {
    Image<Bgr, Byte> frame = logitec.QueryFrame();
    if (temp != null)
      temp.Dispose();
    temp = frame.ToBitmap();
    pictureBox2.Image = temp;
   }
}

问题是我仍然收到此代码的“内存不足异常”。我尝试使用 BackgroundWorker ReportProgress 释放 pictureBox2.Image 变量,并在上面的代码中等待 dispose 完成(您需要与 gui 同步才能在 PictureBox 图像上调用 dispose)。我还尝试使用 Image 类的“Bitmap”属性在 Image 和 Bitmap 之间共享数据。

所以我的问题是,在这种情况下,处理我的图像的正确方法是什么?

【问题讨论】:

  • 内存不足异常在哪里抛出?
  • frame在哪里声明?框架是什么类型?框架需要处理吗?
  • 抱歉,现在显示框架声明。在 frame.ToBitmap(); 上抛出 Out of Memory 异常;
  • 哇,效果非常好。如果您想将其发布为答案,我会接受。我曾假设因为我在其他地方使用图像数据,所以我无法处理它或将其包装在 using 语句中,所以我什至没有尝试过。谢谢:)
  • 我不确定你到底想做什么;只有分配给pictureBox2.Image 的最后一个值才重要,那你为什么要写剩下的呢?如果您想在循环运行时更新显示屏上的图像,您应该从pictureBox2 获取设备上下文并直接绘制它。如果您自己绘制图像,则可以在绘制后立即处理它(最后一张除外)。

标签: c# multithreading bitmap dispose emgucv


【解决方案1】:

您的Image&lt;Bgr, Byte&gt; 声明应该有一个 using 语句。见the documentation

【讨论】:

  • 完美。由于我的代码实际上比我发布的 sn-p 复杂一些,因此在分配给 PictureBox 后,我只是调用了 Image.Dispose() 方法。我应该意识到分配复制了数据,然后释放位图就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2018-04-20
  • 2011-03-04
  • 2023-02-03
  • 2016-01-27
  • 2011-02-09
相关资源
最近更新 更多