Я работаю в 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 As New SetIImageDelegate (AddressOf UpdateImageInGuiGuiThread) Me.Dispatcher.Invoke (dl, imgSrc)
Протестировано с32-битные и 24-битные изображения - сравнить формат изображения
Использование Пакет профилирования производительности для частоты кадров
Но процессор все еще около 10%, а не 100%, а частота кадров составляет максимум 12 кадров в секунду вместо 39 (Winforms).
Как улучшить частоту кадров с камеры?