Снимок с веб-камеры с использованием экспресс-кодера

Я использовал пример, который я нашел по адресу 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()

И проверьте, работает ли это для вас. Я предполагаю, что ваша веб-камера не инициализировалась, когда вы сделали снимок.

Другие вопросы по тегам