I'm using Winforms C# .NET 3.5. I'm getting frames, and this is how I handle them:
delegate void videoStream_NewFrameDelegate(object sender, NewFrameEventArgs eventArgs);
public void videoStream_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
if (ready)
{
if (this.InvokeRequired)
{
videoStream_NewFrameDelegate del = new videoStream_NewFrameDelegate(videoStream_NewFrame);
this.Invoke(del, new object[] {sender, eventArgs} );
}
else
{
Rectangle rc = ClientRectangle;
Bitmap bmp = new Bitmap(rc.Width, rc.Height);
Graphics g = Graphics.FromImage((Image)bmp);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
g.DrawImage((Bitmap)eventArgs.Frame, rc.X+10, rc.Y+10, rc.Width-20, rc.Height-20);
g.Dispose();
this.Image = (Image)bmp;
}
}
}
Is there any way to optimize or improve performance?
I'm getting low performance when my image is 320x240 and I'm stretching it to 1280x1024, But the same image on 640x480 and stretching to 1280x1024 wont get much loss in performance.
I tried to use WPF and still same performance loss. That is weird because WPF is supposed to use DirectX and be fast in image processing.
Here is my WPF code:
delegate void videoStream_NewFrameDelegate(object sender, NewFrameEventArgs eventArgs);
public void videoStream_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
if (ready)
{
if (!this.Frame.Dispatcher.CheckAccess())
{
videoStream_NewFrameDelegate del = new videoStream_NewFrameDelegate(videoStream_NewFrame);
this.Frame.Dispatcher.Invoke(del, new object[] { sender, eventArgs });
}
else
{
Bitmap bmp = (Bitmap)eventArgs.Frame.Clone();
IntPtr hBitmap = bmp.GetHbitmap();
BitmapSource img = Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
bmp.Dispose();
GC.Collect();
this.Frame.Source = img;
}
}
}