FOTOS COM A WEBCAM

ABREU 07/07/2016 15:52:16
#464616
Boa tarde para todos!
Estou de volta com os meus problemas:

Peguei um código para capturar fotos da WebCam e fiz algumas modificações para atender às minhas necessidades. Eu nunca havia trabalhado com captura de imagens antes; sou completamente leigo no assunto.

Ocorre que o meu app só captura a 1ª foto. Ao tentar fazer nova fotografia, o PictureBox utilizado como tela fica completamente preto e aparece a caixa de diálogo “Fonte de vídeo” (Ver anexo), que não resolve o problema: não abre o PictureBox para a 2ª foto.

Para capturar uma segunda imagem eu preciso reiniciar o computador, o que prejudica totalmente o aplicativo.

Que devo fazer? Como posso resolver este problema? Alguém já passou por isso?

Outro problema é com o tipo de arquivo. Preciso que o app crie um arquivo.jpg o que ele não faz.

Como devo fazer para criar arquivos jpg?


Eis o código completo:

Imports System.Runtime.InteropServices
Imports System.Drawing.Drawing2D
Imports System

Public Class Form1
Const WM_CAP As Short = &H400S
Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP + 10
Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP + 11
Const WM_CAP_EDIT_COPY As Integer = WM_CAP + 30
Const WM_CAP_SET_PREVIEW As Integer = WM_CAP + 50
Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP + 52
Const WM_CAP_SET_SCALE As Integer = WM_CAP + 53
Const WS_CHILD As Integer = &H40000000
Const WS_VISIBLE As Integer = &H10000000
Const SWP_NOMOVE As Short = &H2S
Const SWP_NOSIZE As Short = 1
Const SWP_NOZORDER As Short = &H4S
Const HWND_BOTTOM As Short = 1
Dim iDevice As Integer
Dim hHwnd As Integer
Declare Function SendMessage Lib [Ô]user32[Ô] Alias [Ô]SendMessageA[Ô] (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, <MarshalAs(UnmanagedType.AsAny)> ByVal lParam As Object) As Integer
Declare Function SetWindowPos Lib [Ô]user32[Ô] Alias [Ô]SetWindowPos[Ô] (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
Declare Function DestroyWindow Lib [Ô]user32[Ô] (ByVal hndw As Integer) As Boolean
Declare Function capCreateCaptureWindowA Lib [Ô]avicap32.dll[Ô] (ByVal lpszWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Short, ByVal hWndParent As Integer, ByVal nID As Integer) As Integer
Declare Function capGetDriverDescriptionA Lib [Ô]avicap32.dll[Ô] (ByVal wDriver As Short, ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, ByVal cbVer As Integer) As Boolean

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
carregaDispositivos()
If lstDispositivos.Items.Count > 0 Then
btnIniciar.Enabled = True
lstDispositivos.SelectedIndex = 0
btnIniciar.Enabled = True
Else
lstDispositivos.Items.Add([Ô]Não tem dispositivo de captura instalado.[Ô])
btnIniciar.Enabled = False
End If
btnSalvar.Enabled = False
picCaptura.SizeMode = PictureBoxSizeMode.StretchImage
End Sub

Private Sub carregaDispositivos()
Dim strNome As String = Space(100)
Dim strVer As String = Space(100)
Dim bRetorna As Boolean
Dim x As Integer = 0
Do
bRetorna = capGetDriverDescriptionA(x, strNome, 100, strVer, 100)
If bRetorna Then lstDispositivos.Items.Add(strNome.Trim)
x += 1
Loop Until bRetorna = False
End Sub

Private Sub abreJanelaVisualizacao()
Dim iHeight As Integer = picCaptura.Height
Dim iWidth As Integer = picCaptura.Width
hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, 480, picCaptura.Handle.ToInt32, 0)
If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) Then
SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0)
SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0)
SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0)
SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, picCaptura.Width, picCaptura.Height, SWP_NOMOVE Or SWP_NOZORDER)
btnSalvar.Enabled = True
btnIniciar.Enabled = False
Else
DestroyWindow(hHwnd)
btnSalvar.Enabled = False
End If
End Sub

Private Sub fechaJanelaVisualizacao()
SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, iDevice, 0)
DestroyWindow(hHwnd)
End Sub

Private Sub btnIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIniciar.Click
iDevice = lstDispositivos.SelectedIndex
If iDevice <> -1 Then
abreJanelaVisualizacao()
Else
MsgBox([Ô]Selecione um dispositivo de video[Ô])
End If
End Sub

Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click
Dim dados As IDataObject
Dim bmap As Image
SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0)
dados = Clipboard.GetDataObject()
If dados.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
bmap = CType(dados.GetData(GetType(System.Drawing.Bitmap)), Image)
picCaptura.Image = bmap
fechaJanelaVisualizacao()
btnSalvar.Enabled = False
btnIniciar.Enabled = True
If sfdImage.ShowDialog = System.Windows.Forms.DialogResult.OK Then
bmap.Save(sfdImage.FileName)
End If
End If
Application.Exit()
End Sub

Private Sub bntCancelar_Click(sender As Object, e As EventArgs) Handles bntCancelar.Click
Application.Exit()
End Sub
End Class
NILTON.VIANNA 08/07/2016 10:43:42
#464634
Resposta escolhida
Você já tentou rodar pelo executável pra ver se da o mesmo problema


MESTRE 08/07/2016 10:56:36
#464635
Utilizo o AForge Video.. da uma baixada pelo Nuget e ve se você gosta..

ABREU 09/07/2016 12:39:57
#464664
Prezado Nilton_Vianna,
Testei rodando pelo executável, mas o problema continua...

Caro Mestre,
Eu nunca trabalhei com captura de imagens antes; sou completamente leigo no assunto.
Como devo proceder para baixar o AForge Video.. pelo Nuget?
Toda e qualquer ajuda será indispensável.
Desde já, muito obrigado.
ABREU 09/07/2016 19:45:36
#464668
Em tempo:
Qual pacote AForge Video devo baixar pelo NuGet e como incorporá-lo ao projeto???
Tópico encerrado , respostas não são mais permitidas