【问题标题】:Displaying live images显示实时图像
【发布时间】:2014-01-29 16:55:40
【问题描述】:

我有一个函数,它返回一个字节数组,其中包含来自摄像机的实时 bmp img 数据(包括标题)。 我将该数组写入 MemoryStream 对象。 该对象,我传递给一个 Image 对象构造函数,该构造函数将传递给一个 PictureBox。

tl;博士:

byte[] AoB = GetImage();
MemoryStream ms = new MemoryStream();
ms.Write(AoB, 0, AoB.Length);
pictureBoxImage.Image = Image.FromStream(ms);
ms.Dispose();

所有这些都是在一个延迟为 200 毫秒 (5fps) 的计时器中完成的。 它可以正常工作大约一两分钟,直到 OutOfMemory 异常。 出于某种原因,即使我处理掉了使用的内存,它也会不断生成新的内存。 我也尝试将 ms 声明为全局并每次都刷新它,但仍然不行。 如何在使用相同的内存空间时流式传输图像?

【问题讨论】:

标签: c# out-of-memory


【解决方案1】:

当你用完 Image 对象后,尝试处理它们:

byte[] AoB = GetImage();
using (MemoryStream ms = new MemoryStream()) {
    ms.Write(AoB, 0, AoB.Length);
    Image old = pictureBoxImage.Image;
    pictureBoxImage.Image = Image.FromStream(ms);
    if (old != null) {
        old.Dispose();
    }
}

【讨论】:

    【解决方案2】:

    您绝对应该在处理完旧图像 (as adv12 mentioned) 后将其处理掉,但是您也在内存中创建了两个 byte[]s。第一个是您从GetImage() 获得的那个,第二个是存储在MemoryStream 中的那个,由于其不断增长的算法,它可能比您的源数组大。

    改为使用MemoryStream 构造函数的this overload 来允许您直接将byte[] 传递进去,MemoryStream 将重用该单个数组作为其内部存储,从而减少内存需求。

    byte[] AoB = GetImage();
    using (MemoryStream ms = new MemoryStream(AoB)) {
        Image old = pictureBoxImage.Image;
        pictureBoxImage.Image = Image.FromStream(ms);
        old.Dispose();
    }
    

    【讨论】:

    • 不幸的是它没有工作......它设法减慢了它的速度,但它仍然建立了内存并崩溃。我想我将不得不使用 C++ dll 或不安全的 sn-p... 除非您有任何其他想法?
    • @SharonJDDorot,如果上面没有解决你的泄漏,我猜问题出在 GetImage 方法中。您是否尝试过在不使用任何其他代码的情况下重复调用 GetImage()?
    • GetImage() 函数实际上并不存在,它被列出来涵盖将导致图像数组的不相关代码。它所做的是从传感器读取字节,重新排列它们以生成彩色图像并添加 BMP 标头。是的,我已经在循环中完成了它并将其转储到文件而不是 MemoryStream 中,这很好。
    【解决方案3】:

    尝试设置计时器的AutoReset=false 并在最后一次通话结束时手动重新开始。

    myTimer.AutoReset = false;
    

    图像分配后开始。

    byte[] AoB = GetImage();
    MemoryStream ms = new MemoryStream();
    ms.Write(AoB, 0, AoB.Length);
    pictureBoxImage.Image = Image.FromStream(ms);
    ms.Dispose();
    myTimer.Start().
    

    计时器有可能提前检索图像。

    【讨论】:

    • 多线程?我们知道她用的是哪种计时器吗?如果它是一个 Windows 窗体计时器,它应该只回调 GUI 线程...
    猜你喜欢
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2015-10-30
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多