Снимок с веб-камеры с использованием экспресс-кодера
Я использовал пример, который я нашел по адресу http://www.codeproject.com/Articles/285964/WPF-Webcam-Control чтобы сделать некоторые функции веб-камеры, которые мне нужны. В основном меня интересуют снимки, и я могу заставить их работать в приведенном выше примере без каких-либо проблем. Моя главная проблема заключается в том, что я хочу иметь возможность делать снимок с веб-камеры без предварительного отображения окна предварительного просмотра для пользователя. Изображения просто сохраняются автоматически без какого-либо отображения или чего-либо для пользователя. Ниже то, что у меня есть (на vb.net, но я не против ответов на C#):
Public Shared Function TakeSnapshotReturnBytes(panelHeight As Integer, panelWidth As Integer) As Byte()
Dim b() As Byte = Nothing
Dim vidDevCol As IEnumerable(Of EncoderDevice) = EncoderDevices.FindDevices(EncoderDeviceType.Video)
If vidDevCol IsNot Nothing AndAlso vidDevCol.Count > 0 AndAlso vidDevCol(0) IsNot Nothing Then
Dim tmpJob As LiveJob = Nothing
Dim lvDevSrc As LiveDeviceSource = Nothing
Try
tmpJob = New LiveJob
Using tmpPanel As New System.Windows.Forms.Panel
tmpPanel.Height = panelHeight
tmpPanel.Width = panelWidth
lvDevSrc = tmpJob.AddDeviceSource(vidDevCol(0), Nothing)
lvDevSrc.PreviewWindow = New PreviewWindow(New HandleRef(tmpPanel, tmpPanel.Handle))
tmpJob.ActivateSource(lvDevSrc)
Using MS As New IO.MemoryStream()
Using bmp As New Bitmap(panelWidth, panelHeight)
tmpPanel.DrawToBitmap(bmp, New Rectangle(0, 0, bmp.Width, bmp.Height))
bmp.Save(MS, System.Drawing.Imaging.ImageFormat.Jpeg)
MS.Position = 0
Using br As New IO.BinaryReader(MS)
b = br.ReadBytes(CInt(MS.Length))
End Using
End Using
End Using
End Using
Finally
If lvDevSrc IsNot Nothing Then
tmpJob.RemoveDeviceSource(lvDevSrc)
lvDevSrc.Dispose()
End If
If tmpJob IsNot Nothing Then
tmpJob.Dispose()
End If
End Try
End If
Return b
End Function
Все, что я получаю, это серое окно назад, хотя. Я предполагаю, что я не должен использовать объект "PreviewWindow", но я не могу найти никаких альтернатив. У кого-нибудь еще есть удача?
1 ответ
Измените свой код следующим образом:
tmpJob.ActivateSource(lvDevSrc)
// This delay let your camera to initialize and ready to capture image.
// Actualy we should find another safer :) way to do this but just to check if it works!
System.Threading.Thread.Sleep(5000)
Using MS As New IO.MemoryStream()
И проверьте, работает ли это для вас. Я предполагаю, что ваша веб-камера не инициализировалась, когда вы сделали снимок.