图片框刷新时 CPU 负载较高(25 fps)

问题描述 投票:0回答:1

我尝试在图片框中显示来自网络摄像机的实时流,我每 40 毫秒收到一张新图像,我无法确定图片的哪些区域发生了更改,所以

pictureBox1.Invalidate(targetRect)
对我不起作用。运行正常,但是CPU占用率很高。

winform 中还有其他更好的控件更适合此任务吗?我需要一个具有图像更新方法的控件。

Winform - 刷新逻辑

private void ReceiveFrame(byte[] imageData)
{
    Interlocked.Increment(ref this._fps);
    var lastImage = this.pictureBox1.Image;

    var image = this.ByteToImage(imageData);
    if (this.pictureBox1.InvokeRequired)
    {
        this.pictureBox1.Invoke((MethodInvoker)delegate { this.pictureBox1.Image = image; });
    }
    else
    {
        this.pictureBox1.Image = image;
    }

    lastImage?.Dispose();
}

private Image ByteToImage(byte[] imageData)
{
    try
    {
        using (var memoryStream = new MemoryStream())
        {
            memoryStream.Write(imageData, 0, Convert.ToInt32(imageData.Length));
            return Image.FromStream(memoryStream);
        }
    }
    catch (Exception)
    {
        return null;
    }
}

WPF - 刷新逻辑(更新我的问题 - 第 1 部分) CPU占用率也很高

private void ReceiveFrame(byte[] image)
{
    this.LiveImage.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { this.LiveImage.Source = this.ByteToBitmapFrame(image); }));
}

private BitmapFrame ByteToBitmapFrame(byte[] imageData)
{
    try
    {
        using (var memoryStream = new MemoryStream())
        {
            memoryStream.Write(imageData, 0, Convert.ToInt32(imageData.Length));
            return BitmapFrame.Create(memoryStream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
        }
    }
    catch (Exception)
    {
        return null;
    }
}

Winform - 刷新逻辑(更新我的问题 - 第 2 部分)

ByteToImage 方法每个图像需要 6 毫秒(分辨率:1920x1080,大小:6MB,格式:BMP)我已将 validateImageData 设置为 false 来优化速度,现在每个图像需要 3.5 毫秒。首先,我遇到了一个 GDI 异常问题,如果您需要图片框中的图像而不是使用它,则如果 MemoryStream 进行处置,就会出现问题。 图像绘制性能 msdn

---------------------------------------------------------------
| Resolution | Format | Size  | ValidateImageData | Duration  |
---------------------------------------------------------------
| 1920x1080  | BMP    | 6MB   | true              | 6ms       |
---------------------------------------------------------------
| 1920x1080  | BMP    | 6MB   | false             | 3.5ms     |
---------------------------------------------------------------
| 1920x1080  | JPEG   | 270KB | true              | 10ms      |
---------------------------------------------------------------
| 1920x1080  | JPEG   | 270KB | false             | 0.1ms     |
---------------------------------------------------------------

示例验证图像数据

private static Image ByteToImage(byte[] imageData)
{
    try
    {
        using (var memoryStream = new MemoryStream(imageData.Length))
        {
            memoryStream.Write(imageData, 0, Convert.ToInt32(imageData.Length));
            return Image.FromStream(memoryStream, false, false);
        }
    }
    catch (Exception exception)
    {
        return null;
    }
}
c# winforms video-streaming picturebox
1个回答
0
投票

这篇文章有更新吗?这个问题解决了吗?

© www.soinside.com 2019 - 2024. All rights reserved.