Я работаю в WPF в .Net 4.0. У меня есть несколько огромных изображений с камеры 1392x1040 пикселей. Каждый кадр идет как System.Drawing.Bitmap
и будет быть преобразованным в BitmapImage с помощью
Public Function BitmapToWpfBitmapSource(ByVal bmSrc As System.Drawing.Bitmap) As BitmapSource
If bmSrc Is Nothing Then Return Nothing
Dim res As BitmapSource
Dim Ptr As IntPtr
Ptr = bmSrc.GetHbitmap(System.Drawing.Color.Black) 'Create GDI bitmap object
res = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(Ptr, IntPtr.Zero, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromWidthAndHeight(bmSrc.Width, bmSrc.Height))
Dim ret As Integer = DeleteObject(Ptr) 'Delete GDI bitmap object
GC.Collect() 'Because the code is not managed, we need to call the collector manually to avoid memory spikes
Return res
End Function
Если я обновляю изображения в графическом интерфейсе, я могу получать около 7 кадров в секунду.
Были некоторые возможности увеличить скорость за счет снижения качества:
RenderOptions.SetBitmapScalingMode (Me.ucWindow1.VideoPresenter1.img1, BitmapScalingMode.NearestNeighbor)
Работа с потоками для обновления каждого кадра
Dim dl как новый SetImageDelegate (AddressOuiGuiImageIn) Me.Dispatcher.Invoke (dl, imgSrc)
Протестировано с 32-битными и 24-битными изображениями - сравнить Imageformat
Использование пакета профилирования производительности для подсчета частоты кадров
Но процессор все еще составляет около 10%, а не 100%, а частота кадров составляет около 12 кадров в секунду вместо 39 (Winforms).
Как повысить частоту кадров с камеры?