我尝试在图片框中显示来自网络摄像机的实时流,我每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;
}
}