带有图片框刷新的高CPU负载(25 fps)

时间:2017-12-26 14:09:20

标签: c# winforms video-streaming picturebox

我尝试在图片框中显示来自网络摄像机的实时流,我每40ms收到一个新图像,我无法确定图片的哪个区域被更改,因此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方法需要每个图像6ms(分辨率:1920x1080,大小:6MB,格式:BMP)我已经将validateImageData设置为false来优化速度,现在每个图像需要3,5ms。首先我有一个GDI异常的问题,如果你需要在图片框中使用Image而不使用它,则会出现问题。 Image Draw Performance 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     |
---------------------------------------------------------------

示例ValidateImageData

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;
    }
}

0 个答案:

没有答案