Smart Tech Diary

The Smart Tech Diary

We recommend Divi Theme For WordPress

  • HOME
  • ABOUT
  • Topics
    • Programming
    • Computing
    • Hacking
    • Electronics
    • Web Design
  • CONTACT
  • Subscribe
  • Hacking Disclaimer
  • Privacy
You are here: Home / Computing / How to capture and save pictures to a folder using a webcam in VB.Net

How to capture and save pictures to a folder using a webcam in VB.Net

5th October 2015 by Abdalla Nizar 15 Comments

How to capture and save pictures to a folder using a webcam in VB.Net Complete Source Code

Having a way to capture and save pictures is a great add on in any software. For example if you are building a Clinic Management System or HR System it would be nice to capture Patient Photos or Employee Photos using your  webcam instead of using a separate camera or scanning passport photos.

In this tutorial I am going to show you how to capture and save pictures to a folder using a webcam in VB.Net.

How to capture and save pictures to a folder using a webcam in VB.Net

Requirements

As you have probably guessed, you will need a webcam for this. If you are using a Laptop with a webcam that will be perfect. The other thing you will need is a Visual Studio IDE. For this tutorial I will be using Visual Studio 2010. And lastly a DLL Library known as avicap2.dll

  • Webcam
  • Visual Studio IDE
  • AviCap32.dll

 

AviCap32.dll

The module avicap32.dll is an Audio-Video Interleaved (AVI) Video Capture dynamic link library registered under Microsoft Corporation. It is developed by Microsoft to be part of its Windows operating system. So there is no need of any downloads.

A very common function of the avicap32.dll module is to enable Windows to capture movies and video images from cameras like digital cameras, web cameras, video cards and other video hardware. Furthermore, the avicap32.dll application stores the resulting video as AVI format. The AVI format is the most common format defined by Windows for audio and video data on a computer. Basically, when a user records a video or is using a webcam for video conferencing, the video capturing process takes place. Read more about avicap32.dll here

How to capture and save pictures to a folder using a webcam in VB.Net

Enough with the stories. Now lets get to work.

  • Open your Visual Studio IDE – Go to File and click New Project

capture images-pictures-using-a-webcam-vb.net-new project

  • Choose Window Form Application – Enter the name of your project and click ok.

capture images-pictures-using-a-webcam-vb.net-windows-form-application

  • Form Design

This application will list all the webcam devices available a List Box (lstDevices). The capture video from the webcam will be displayed on a Picture Box (picCapture). 4 buttons have been used (btnStart, btnStop, btnSave, btnInfo) and a Save File Dialog(sfdImage). Design your form as described it should look similar to what I have.

capture images-pictures-using-a-webcam-vb.net-windows-form-application

  • Form Code

Now it is time to give some logic to our Form. Copy and paste the below code to your Form and run the program

Option Explicit On
Imports System.Runtime.InteropServices
Public Class frmCapturePictureWebCam
    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
    Public Const WM_CAP_GET_STATUS As Integer = WM_CAP + 54
    Public Const WM_CAP_DLG_VIDEOFORMAT As Integer = WM_CAP + 41
    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
    Private DeviceID As Integer = 0 ' Current device ID
    Private hHwnd As Integer ' Handle to preview window

    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
        ByRef lParam As CAPSTATUS) As Boolean


    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
       (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Boolean, _
       ByRef lParam As Integer) As Boolean


    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
         (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
         ByRef lParam As Integer) As Boolean


    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
    Structure POINTAPI
        Dim x As Integer
        Dim y As Integer
    End Structure
    Public Structure CAPSTATUS
        Dim uiImageWidth As Integer                    '// Width of the image
        Dim uiImageHeight As Integer                   '// Height of the image
        Dim fLiveWindow As Integer                     '// Now Previewing video?
        Dim fOverlayWindow As Integer                  '// Now Overlaying video?
        Dim fScale As Integer                          '// Scale image to client?
        Dim ptScroll As POINTAPI                    '// Scroll position
        Dim fUsingDefaultPalette As Integer            '// Using default driver palette?
        Dim fAudioHardware As Integer                  '// Audio hardware present?
        Dim fCapFileExists As Integer                  '// Does capture file exist?
        Dim dwCurrentVideoFrame As Integer             '// # of video frames cap'td
        Dim dwCurrentVideoFramesDropped As Integer     '// # of video frames dropped
        Dim dwCurrentWaveSamples As Integer            '// # of wave samples cap'td
        Dim dwCurrentTimeElapsedMS As Integer          '// Elapsed capture duration
        Dim hPalCurrent As Integer                     '// Current palette in use
        Dim fCapturingNow As Integer                   '// Capture in progress?
        Dim dwReturn As Integer                        '// Error value after any operation
        Dim wNumVideoAllocated As Integer              '// Actual number of video buffers
        Dim wNumAudioAllocated As Integer              '// Actual number of audio buffers
    End Structure
    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 LoadDeviceList()
        Dim strName As String = Space(100)
        Dim strVer As String = Space(100)
        Dim bReturn As Boolean
        Dim x As Short = 0
        ' 
        ' Load name of all avialable devices into the lstDevices
        '
        Do
            '
            '   Get Driver name and version
            '
            bReturn = capGetDriverDescriptionA(x, strName, 100, strVer, 100)
            '
            ' If there was a device add device name to the list
            '
            If bReturn Then lstDevices.Items.Add(strName.Trim)
            x += CType(1, Short)
        Loop Until bReturn = False
    End Sub

    Private Sub OpenPreviewWindow()
        Dim iHeight As Integer = picCapture.Height
        Dim iWidth As Integer = picCapture.Width
        '
        ' Open Preview window in picturebox
        '
        hHwnd = capCreateCaptureWindowA(DeviceID.ToString, WS_VISIBLE Or WS_CHILD, 0, 0, 1280, _
            1024, picCapture.Handle.ToInt32, 0)
        '
        ' Connect to device
        '
        If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, DeviceID, 0) Then
            '
            'Set the preview scale
            '
            SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0)

            '
            'Set the preview rate in milliseconds
            '
            SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0)

            '
            'Start previewing the image from the camera
            '
            SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0)

            '
            ' Resize window to fit in picturebox
            '
            SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, picCapture.Width, picCapture.Height, _
                    SWP_NOMOVE Or SWP_NOZORDER)

            btnSave.Enabled = True
            btnStop.Enabled = True
            btnStart.Enabled = False
            btnInfo.Enabled = True
        Else
            '
            ' Error connecting to device close window
            ' 
            DestroyWindow(hHwnd)
            btnSave.Enabled = False
        End If
    End Sub
    Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
        DeviceID = lstDevices.SelectedIndex
        OpenPreviewWindow()
        Dim bReturn As Boolean
        Dim s As CAPSTATUS
        bReturn = SendMessage(hHwnd, WM_CAP_GET_STATUS, Marshal.SizeOf(s), s)
        Debug.WriteLine(String.Format("Video Size {0} x {1}", s.uiImageWidth, s.uiImageHeight))
    End Sub
    Private Sub ClosePreviewWindow()
        '
        ' Disconnect from device
        '
        SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, DeviceID, 0)
        '
        ' close window
        '
        DestroyWindow(hHwnd)
    End Sub
    Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
        ClosePreviewWindow()
        btnSave.Enabled = False
        btnStart.Enabled = True
        btnInfo.Enabled = False
        btnStop.Enabled = False
    End Sub
    Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        Dim data As IDataObject
        Dim bmap As Bitmap

        '
        ' Copy image to clipboard
        '
        SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0)
        '
        ' Get image from clipboard and convert it to a bitmap
        '
        data = Clipboard.GetDataObject()
        If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
            bmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Bitmap)
            picCapture.Image = bmap
            ClosePreviewWindow()
            btnSave.Enabled = False
            btnStop.Enabled = False
            btnStart.Enabled = True
            btnInfo.Enabled = False
            Trace.Assert(Not (bmap Is Nothing))
            If sfdImage.ShowDialog = DialogResult.OK Then
                bmap.Save(sfdImage.FileName, Imaging.ImageFormat.Bmp)
            End If
        End If
    End Sub
    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        If btnStop.Enabled Then
            ClosePreviewWindow()
        End If
    End Sub



    Private Sub btnInfo_Click(sender As System.Object, e As System.EventArgs) Handles btnInfo.Click
        ' SendMessage(hHwnd, WM_CAP_DLG_VIDEOFORMAT, 0&, 0&)
        SendMessage(hHwnd, WM_CAP_DLG_VIDEOFORMAT, True, 0)
    End Sub

    Private Sub Form1_Load_1(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        LoadDeviceList()
        If lstDevices.Items.Count > 0 Then
            btnStart.Enabled = True
            lstDevices.SelectedIndex = 0
            btnStart.Enabled = True
        Else
            lstDevices.Items.Add("No Capture Device")
            btnStart.Enabled = False
        End If
        Me.AutoScrollMinSize = New Size(100, 100)
        btnStop.Enabled = False
        btnSave.Enabled = False
        btnInfo.Enabled = False
        picCapture.SizeMode = PictureBoxSizeMode.StretchImage
    End Sub
End Class

This code is available in several places online and I am not very sure of the original source. For this article I have referenced this article from vb-tip.com

 

Share this:

  • Reddit
  • Email
  • Print
  • WhatsApp
  • Skype

Related

Filed Under: Computing, Programming Tagged With: capture image from webcam, capture images from webcam using vb, capture images from webcam using vb.net, capture picture from webcam, using avicap32.dll

Comments

  1. Nwaoha Stephen says

    14th December 2015 at 8:44 pm

    I thank God for you for such a wonderful work. I did it as you explained, iam using a laptop that has webcam. when I run it . it displays “Microsoft WDM Image Capture (Win32)” then when I click start, it display again select video source “BisonCam, NB Pro” finally when i Click Ok, It didnot capture. Please assist me

    Reply
    • Abdalla Nizar says

      22nd December 2015 at 2:26 pm

      Hi Stephen thank you for your kind words.

      If you followed all the steps correctly. You need to select/hightligh the Microsoft WDM Image Capture(Win32) on the Device List. After that, Click on the Start button and if you want to Capture the image, Click on the Save button, it will open a Save Dialog Box for you to name and save your image. Try that and let me know how it goes.

      Reply
      • sunny says

        28th May 2017 at 12:29 am

        Hi Nizar,

        Thanks for posting the code.
        I have done exactly what have you posted here and i followed the same execution order what have u said in the above content,once after selecting the webcam and click on start button then all other remaining buttons are getting disabled and nothing is changing der.
        Please kindly help.

        Regards,
        Sunny

        Reply
        • Abdalla Nizar says

          1st June 2017 at 12:19 pm

          Hi Sunny,
          Thanks for your comment. You need to check if your webcam is working correctly first. You can use your default Web Cam application to confirm. If the Web Cam has some driver issue it will not work. Let me know how it goes.

          Regards,
          Abdalla Nizar

          Reply
  2. Nguyen Trong Doan says

    25th May 2019 at 3:52 am

    it cannot run on win10

    Reply
    • Abdalla Nizar says

      3rd August 2019 at 8:36 am

      It should be able to run.

      Reply
  3. SUnil Desai says

    24th September 2019 at 10:38 pm

    Works. Just what I required. Thanks a lot.

    Reply
  4. John says

    15th June 2020 at 8:47 pm

    Hi there,

    many thanks for posting this
    i have tied it in windows 10 and the image just displays as black
    have you any yhoughts please?
    thanks John

    Reply
  5. Sugata Mitra says

    25th June 2020 at 9:30 am

    There is an error in the code posted above. Add the following line before line 188:

    Dim sfdImage As New SaveFileDialog

    Otherwise it worked fine on my Dell XPS13 except that it does not show the built in webcam picture, even though the built in webcam is working and its light comes on. But if I fix another camera and select that camera, everything works just fine.

    Reply
  6. KH NAIR says

    18th July 2020 at 9:00 pm

    Hi Sir
    Not understanding
    1)LoadDeviceList()- where to change this or is this control
    2)ClosePreviewWindow()
    3)openPreviewWindow()
    4)sdfImage

    kindly explain these above four .
    thanking you
    regards
    khn

    Reply
  7. KH NAIR says

    20th July 2020 at 2:04 pm

    Hi Sir
    ‘ Open Preview window in picturebox .
    ‘ Create a child window with capCreateCaptureWindowA so you can display it in a picturebox.
    Please can u explain how to do this exactly

    regards
    khn

    Reply
  8. lexcus says

    18th November 2020 at 7:10 pm

    not sure why, after i copy your code my whole project can’t debug

    Reply
  9. lexcus says

    19th November 2020 at 6:12 am

    Hi
    I meet one problem , after i click the save button, the image format,did’t not display, when i click the properties of the image it show the image type is file

    Any solution to fix this problem?

    Reply
  10. Subhag says

    2nd April 2021 at 1:06 pm

    Thanks much, works fine. Just make sure to add SaveFileDialog to your form

    Reply
  11. Atwar says

    29th April 2021 at 7:32 am

    Thanks for wonderful solution.Please can u tell me how to increase the size as this shows 640×480 maximum

    Reply

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

WordPress-Security-For-Non-Geeks

Subscribe to Download The E-Book

* indicates required

Recent Posts

  • Why I will never use nulled WordPress themes again
  • New WordPress 4.8 has been released, Don’t Be Late
  • WikiLeaks reveals Grasshopper Malware, the CIA’s Windows hacking tool
  • The Ultimate WordPress Security Guide 2017 | How To Secure Your WordPress Website
  • How to purchase data bundle for Airtel postpaid lines

Categories

  • Computing
  • Databases
  • Digital Marketing
  • Electronics
  • Hacking
  • Kenya How Tos
  • Programming
  • Web Design
  • Wordepress Security
  • WordPress

Copyright © 2023 · The Smart Tech Diary