Click here to Skip to main content
15,879,095 members
Please Sign up or sign in to vote.
1.00/5 (2 votes)
See more:
Hi I have been looking everywhere for some simple code that does not show any webcam picture on the program's GUI but just takes the picture and saves discreetly in the background. You may ask why I need to do this? Well it's for use in my encryption programs for random key generation as my plan is to take a hash from the saved picture and use that as a random "key" then to delete the picture afterwards. I am sorry I don't have any code to show of my own as I don't want to be perceived as 'lazy' by some I just want some short as possible code to do this task but as I am not used in this area of vb.net where you handle external devices like webcams so I don't quite know how to interpret this code to shorten it down. The code below is of a program that has a device selection in the GUI which the user can select the webcam to use, it has a screen in which the live camera stream can be seen,has a start/stop button to stop/stop the camera live stream and finally has a 'save as' button where the user chooses to save the picture. Below is the form layout, Thank you.
christianshelton | Flickr - Photo Sharing![^]

What I have tried:

VB
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 = 0
    Dim hHwnd As Integer
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, 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 LoadDeviceList()
        Dim strName As String = Space(100)
        Dim strVer As String = Space(100)
        Dim bReturn As Boolean
        Dim x As Integer = 0
        Do
            bReturn = capGetDriverDescriptionA(x, strName, 100, strVer, 100)
            If bReturn Then lstDevices.Items.Add(strName.Trim)
            x += 1
        Loop Until bReturn = False
    End Sub

    Private Sub OpenPreviewWindow()
        Dim iHeight As Integer = picCapture.Height
        Dim iWidth As Integer = picCapture.Width
        hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, 480, picCapture.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, picCapture.Width, picCapture.Height, SWP_NOMOVE Or SWP_NOZORDER)
            btnSave.Enabled = True
            btnStop.Enabled = True
            btnStart.Enabled = False
        Else
            DestroyWindow(hHwnd)
            btnSave.Enabled = False
        End If
    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 Image
        SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0)
        data = Clipboard.GetDataObject()
        If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
            bmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Image)
            picCapture.Image = bmap
            ClosePreviewWindow()
            btnSave.Enabled = False
            btnStop.Enabled = False
            btnStart.Enabled = True
            If sfdImage.ShowDialog = DialogResult.OK Then
                bmap.Save(sfdImage.FileName, Imaging.ImageFormat.Bmp)
            End If
        End If
    End Sub

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

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        LoadDeviceList()
    End Sub

    Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
        OpenPreviewWindow()
        btnStart.Enabled = False
        btnStop.Enabled = True
    End Sub

    Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
        ClosePreviewWindow()
        btnStart.Enabled = True
        btnStop.Enabled = False
    End Sub
End Class
Posted
Updated 7-May-16 12:31pm
v3
Comments
Sergey Alexandrovich Kryukov 7-May-16 17:40pm    
The idea looks totally pointless. Why having some picture used, essentially, as some random data, if you can always generate random data directly? Besides, the algorithm for key generation for different cryptosystems are well known.
—SA
chris47368 7-May-16 18:14pm    
Many random number generator algorithms used in computer are not very secure (For example:linear-congruential generator) the best generators however use external factors like radiation decay, background static, resistance in resistors...ect these are all very unpredictable things to people trying to guess sequences and thus makes it virtually impossible to find patterns thus are much more secure than 'pseudo-random' computer algorithms. That's why I need the pictures. Even seemingly identical pictures will make different hashes due to ambient noise in the camera picture. Randomness is everything in decent cryptography.
Sergey Alexandrovich Kryukov 7-May-16 18:23pm    
Of course, but I say: key generation in cryptography is already well developed. And I disagree that random generators compromise security. There problem is presence of correlations, bad implementation of required random distribution, and so on. But it does not mean compromising security. Of course you need some seed from a truly random source, not pseudo-random. Of course, pictures will work, but it seems to be an apparent overkill. Just the time can make a good seed.
—SA
chris47368 7-May-16 18:36pm    
Well is it really and truly overkill? Can you ever truly overkill security? Look at random.org for example they use background noise to make random numbers and look at their random analysis, it's totally unpredictable. Would you call them overkill? Their website is used by many people world wide for generating random passwords.Its also very fast compared to other methods too.
Sergey Alexandrovich Kryukov 7-May-16 19:09pm    
Please pay attention: in your argument, you make some trivial logical mistake. I never say it's security overkill. I mean that the random source you want to introduce does not add anything to security.
Your reference is totally irrelevant. This side is about true randomeness and not about true security. One thing does not incur another thing.

Besides, your arguments related to this link look like a kind of argumentum ad verecundiam. If this is really your intention, the use of that false logical argument would totally carry you out of the domain of scientific discussion.

—SA

1 solution

Here is my bottom line:

  • The question about using images from a Web camera was asked and answered so many times that it would be really bad to answer it again and again. A good source for the solutions (many) is CodeProject search: Search — CodeProject[^].
  • I know your idea can work, but I am sure it doesn't have any cryptographic value. I believe you have everything to develop it, if I did not convince you.


—SA
 
Share this answer
 
v2

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900