我尝试在图片框中显示来自网络摄像机的实时流,我每 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;
}
}
这篇文章有更新吗?这个问题解决了吗?