VB .NET -  Cadastro com Foto de WebCam (para novatos)


 No artigo de hoje vou mostrar como criar um programa bem simples que realiza o cadastro de usuários e que obtém a foto a partir de uma webcam e armazena em um banco de dados MS Access.

O programa utiliza a linguagem VB .NET e armazena os dados em um banco de dados MS Access.

Seu objetivo e gravar os dados dos usuários em uma tabela Usuarios do banco de dados Cadastro.accdb cuja estrutura é vista abaixo:

Embora seja um programa para quem esta iniciando na linguagem VB .NET ele utiliza conceitos importantes como:

O projeto possui 4 formulários :

1- Formulário de apresentação com as opções de acesso aos demais formulários

2- Formulário para registrar o usuário

3- Formulário para ativar a WebCam e capturar a imagem

4 - Formulário para visualizar os dados e deletar registros

Além dos formulários temos os seguintes recursos no projeto:

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando a solução no VS 2015

Abra o VS 2015 Community  e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application e informe o nome : Cadastro_WebCam;

Em todos os formulários usados no projeto adotei as seguintes configurações:

1 - Formulário - frmMenu - opções para acessar os demais formulários

Public Class frmMenu
    Private Sub btnRegistrar_Click(sender As Object, e As EventArgs) Handles btnRegistrar.Click
        My.Forms.Form1.Show()
    End Sub
    Private Sub btnVisualizar_Click(sender As Object, e As EventArgs) Handles btnVisualizar.Click
        My.Forms.Form3.Show()
    End Sub
    Private Sub btnEncerrar_Click(sender As Object, e As EventArgs) Handles btnEncerrar.Click
        If MessageBox.Show("Deseja encerrar o programa ?", "Encerrar", MessageBoxButtons.YesNo) = DialogResult.Yes Then
            Me.Close()
        End If
    End Sub
    Private Sub picClose_Click(sender As Object, e As EventArgs) Handles picClose.Click
        btnEncerrar.PerformClick()
    End Sub
End Class

2 - Formulário - Form1 - Registra o usuário com foto capturada da WebCam

Namespaces usados no formulário:

Imports System.Text
Imports
System.Text.RegularExpressions
Imports
System.IO
Imports
System.Security.Cryptography

A seguir os principais eventos e métodos usados neste formulário:


		
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'obtem a imagem de resources
        picFoto.Image = My.Resources.semimagem
    End Sub
    Private Sub btnRemoverFoto_Click(sender As Object, e As EventArgs) Handles btnRemoverFoto.Click
        'obtem a imagem de resources
        picFoto.Image = My.Resources.semimagem
    End Sub
    Private Sub Salvar()
        Try
            'cifra os dados e armazena 
            Dim senha As String = CifrarDados(txtSenha.Text)
            'cria um stream na memória
            Dim ms As New MemoryStream()
            'cria um objeto imagem
            Dim bmpImage As New Bitmap(picFoto.Image)
            If (SalvaDados(ms, bmpImage, txtNome.Text, txtEmail.Text, senha)) Then
                MessageBox.Show("Usuário salvo com sucesso", "Salvo", MessageBoxButtons.OK, MessageBoxIcon.Information)
                LimpaControles(Me)
                txtNome.Focus()
            End If
        Catch ex As Exception
            MessageBox.Show(ex.ToString)
        Finally
            If con.State = ConnectionState.Open Then
                con.Close()
            End If
        End Try
    End Sub
    
    Public Shared Function IsValidEmail(ByVal email As String) As Boolean
        Dim padraoRegex As String = "^[-a-zA-Z0-9][-.a-zA-Z0-9]*@[-.a-zA-Z0-9]+(\.[-.a-zA-Z0-9]+)*\." &
        "(com|edu|info|gov|int|mil|net|org|biz|name|museum|coop|aero|pro|tv|[a-zA-Z]{2})$"
        Dim verifica As New RegularExpressions.Regex(padraoRegex, RegexOptions.IgnorePatternWhitespace)
        Dim valida As Boolean = False
        'verifica se foi informado um email
        If String.IsNullOrEmpty(email) Then
            valida = False
        Else
            'usa IsMatch para validar o email
            valida = verifica.IsMatch(email)
        End If
        'retorna o valor
        Return valida
    End Function
    
   Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
        If e.KeyChar = Convert.ToChar(13) Then
            e.Handled = True
            SendKeys.Send("{TAB}")
        End If
    End Sub

    Private Sub LimpaControles(ByVal controlP As Control)
        Dim ctl As Control
        For Each ctl In controlP.Controls
            If TypeOf ctl Is TextBox Then
                DirectCast(ctl, TextBox).Text = String.Empty
            ElseIf ctl.Controls.Count > 0 Then
                LimpaControles(ctl)
            End If
        Next
    End Sub
   
 Public Function CifrarDados(ByVal textoplano As String) As String
        ' Converte o texto plano para um array de bytes
        Dim textoplanoBytes() As Byte = Encoding.Unicode.GetBytes(textoplano)
        ' Cria o stream
        Dim ms As New MemoryStream
        ' Cria o codificador para escrever no stream
        Dim encStream As New CryptoStream(ms, TripleDes.CreateEncryptor(), CryptoStreamMode.Write)
        ' Use o stream criptografado para escrever o array de bytes no stream
        encStream.Write(textoplanoBytes, 0, textoplanoBytes.Length)
        encStream.FlushFinalBlock()
        ' Converte o stream cifrado para uma string
        Return Convert.ToBase64String(ms.ToArray)
    End Function
End Class

3- Formulário - Form2 -  Gerencia a WebCam , ativando, desativando e  capturando a imagem

Abaixo temos a rotina Inserido que é usada quando um novo evento é iniciado.

Public Class Form2
    'aloca uma variável do tipo iCam
    Private minhaWebCam As iCam

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'cria uma instância da classe iCam
        minhaWebCam = New iCam
        'inicializa a câmera
        minhaWebCam.initCam(Me.picImagem.Handle.ToInt32)
        btnCapturaImagem.Focus()
    End Sub

    Private Sub picClose_Click(sender As Object, e As EventArgs) Handles picClose.Click
        'encerra e  fecha
        minhaWebCam.closeCam()
        Application.DoEvents()
        minhaWebCam = Nothing
        Me.Close()
    End Sub
    Private Sub btnCapturaImagem_Click(sender As Object, e As EventArgs) Handles btnCapturaImagem.Click
        'verifica se a webcam esta ativa e obtem a imagem capturada
        If minhaWebCam.iRunning Then
            Form1.picFoto.Image = minhaWebCam.copyFrame(Me.picImagem, New RectangleF(0, 0,
                            Me.picImagem.Width, Me.picImagem.Height))
            Form1.Show()
        Else
            MessageBox.Show("A Camara não esta ativa !")
        End If
    End Sub

    Private Sub btnCancelaCaptura_Click(sender As Object, e As EventArgs) Handles btnCancelaCaptura.Click
        'desativa a webcam
        minhaWebCam.closeCam()
        Me.Close()
    End Sub
End Class

4 - Formulário - Form3 -  Visualizar os dados dos usuário e permite e deletar registros

Imports System.IO
Public Class Form3
    Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            ExibeDados()
        Catch ex As Exception
            MessageBox.Show("Erro : " + ex.Message)
        End Try
    End Sub
    Private Sub ExibeDados()
        Try
            Dim ds As DataSet = GetDados()
            dgvUsuarios.DataSource = ds.Tables(0).DefaultView
            picImagem.Image = My.Resources.semimagem
        Catch ex As Exception
            Throw
        End Try
    End Sub

    Private Sub dgvUsuarios_RowHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgvUsuarios.RowHeaderMouseClick
        Try
            Dim dr As DataGridViewRow = dgvUsuarios.SelectedRows(0)
            Dim data As Byte() = DirectCast(dr.Cells(4).Value, Byte())
            Dim ms As New MemoryStream(data)
            Me.picImagem.Image = Image.FromStream(ms)
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub btnFechar_Click(sender As Object, e As EventArgs) Handles btnFechar.Click
        Try
            If MessageBox.Show("Deseja realmente deletar este registro ?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then
                Deletar()
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub Deletar()
        Dim resultado As Integer
        Try
            Dim rowindex As Integer = dgvUsuarios.CurrentCell.RowIndex
            Dim columnindex As Integer = dgvUsuarios.CurrentCell.ColumnIndex
            Dim codigo As Integer = dgvUsuarios.Rows(rowindex).Cells(columnindex).Value
            resultado = DeletarRegistro(codigo)
            If resultado > 0 Then
                MessageBox.Show("Registro deletado com sucesso", "Deletado", MessageBoxButtons.OK, MessageBoxIcon.Information)
                ExibeDados()
            Else
                MessageBox.Show("Registro não encontrado", "Não Encontrado", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        Catch ex As Exception
            Throw
        End Try
    End Sub

    Private Sub picClose_Click(sender As Object, e As EventArgs) Handles picClose.Click
        Me.Close()
    End Sub
End Class

5- Módulo ModeConexao - Contém  os métodos para exibir, incluir  e excluir registros do banco de dados

A string de conexão do banco de dados esta definida da seguinte forma:

    Public Const cnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Cadastro.accdb;Persist Security Info=False;"

Imports System.Data.OleDb
Imports System.IO
Module ModConexao
    Public con As OleDbConnection = Nothing
    Public ds As DataSet
    Public cmd As OleDbCommand = Nothing
    Public Const cnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Cadastro.accdb;Persist Security Info=False;"
    Public Function GetDados(ByVal sSQL As String) As OleDbDataReader
        Dim sqlCmd As OleDbCommand = New OleDbCommand(sSQL)
        Dim dr As OleDbDataReader
        con = New OleDbConnection(cnString)
        Try
            con.Open()
            sqlCmd.Connection = con
            dr = sqlCmd.ExecuteReader
            Return dr
        Catch ex As Exception
            Throw
        Finally
            If con.State = ConnectionState.Open Then
                con.Close()
            End If
        End Try
    End Function

    Public Function GetDados() As DataSet
        Try
            'abre a cpmexão
            con = New OleDbConnection(cnString)
            con.Open()
            'define o comando sql e dataadapter o dataset
            cmd = New OleDbCommand("SELECT UsuarioId, Nome, Email, Senha, Foto From Usuarios ", con)
            Dim da As OleDbDataAdapter = New OleDbDataAdapter(cmd)
            Dim ds As DataSet = New DataSet()
            da.Fill(ds, "Usuarios")
            'retorna o dataset
            Return ds
        Catch ex As Exception
            Throw
        Finally
            If con.State = ConnectionState.Open Then
                con.Close()
            End If
        End Try
    End Function

    Public Function SalvaDados(ms As MemoryStream, bmpImage As Bitmap, nome As String, email As String, senha As String) As Boolean
        Try
            'abre uma conexão
            con = New OleDbConnection(cnString)
            con.Open()
            'define o comando SQL para incluir no banco de dados
            Dim cb As String = "insert into Usuarios(Nome, Email, Senha, Foto) VALUES (@nome,@email,@senha,@foto)"
            cmd = New OleDbCommand(cb)
            'passa os parâmetros 
            cmd.Parameters.AddWithValue("@nome", nome)
            cmd.Parameters.AddWithValue("@email", email)
            cmd.Parameters.AddWithValue("@senha", senha)
            cmd.Connection = con
            'salva a imagem no stream
            bmpImage.Save(ms, Imaging.ImageFormat.Jpeg)
            Dim data As Byte() = ms.GetBuffer()
            'passa o parametro para imagem
            Dim p As New OleDbParameter("@foto", OleDbType.VarBinary)
            p.Value = data
            cmd.Parameters.Add(p)
            'executa o comando para incluir na tabela
            cmd.ExecuteNonQuery()
            Return True
        Catch ex As Exception
            Throw
        End Try
    End Function

    Public Function DeletarRegistro(codigo As Integer) As Integer
        Try
            Dim LinhasAfetadas As Integer = 0
            con = New OleDbConnection(cnString)
            con.Open()
            Dim sql As String = "delete from Usuarios where UsuarioId=" & codigo
            cmd = New OleDbCommand(sql)
            cmd.Connection = con
            LinhasAfetadas = cmd.ExecuteNonQuery()
            Return LinhasAfetadas
        Catch ex As Exception
            Throw
        Finally
            If con.State = ConnectionState.Open Then
                con.Close()
            End If
        End Try
    End Function
End Module

O projeto pode ser incrementado com outras funcionalidades e com aplicação de boas práticas para otimizar o código, mas foi feito para tornar o entendimento o mais simples possível.

Pegue o projeto completo aqui :  Cadastro_WebCam.zip

"Porque pela graça sois salvos, por meio da fé; e isto não vem de vós, é dom de Deus.
Não vem das obras, para que ninguém se glorie;"

Efésios 2:8,9

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti