พอดีผมได้ลองศึกษา เกี่ยวกับกล้องเว็บแคม มีหลายเว็บที่มีโค้ตให้ดู และก็มีวิธีการหลายอย่างๆ ที่แตกต่างกันไป กล้องเว็บแคมที่ผมทำขึ้นมา
มีวิธีการทำงานดังนี้ครับ
1. เปิดกล้องตอน from_load
2. ใช้ ปุ่ม enter ในการ cap_picture
3. Auto save to sql server
ลองมาดูโค้ตกันนะครับ
Code (VB.NET)
Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices
Imports System.IO
Imports System.Data
Imports System.Data.SqlClient
Public Class webcam
Inherits System.Windows.Forms.Form
Dim path as string=""
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 ' Current device ID
Dim 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, _
<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 Formwebcam_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
LoadDeviceList()
If lstDevices.Items.Count > 0 Then
lstDevices.SelectedIndex = 0
End If
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
iDevice = lstDevices.SelectedIndex
OpenPreviewWindow()
End sub
Private Sub Textboxwebcam_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Textboxwebcam.KeyDown
If e.KeyCode=Keys.Enter then
saveimage()
OpenPreviewWindow()
'save image to sqlserver
' ผมเขียน ย่อๆๆ ให้นะครับ
sql="INSERT INTO ..."
.Parameters.Add("@ImageLog", SqlDbType.VarChar).Value = Path 'โดยนำ path ลง sql
End If
End sub
Private Sub OpenPreviewWindow()
Dim iHeight As Integer = PictureBox1.Height
Dim iWidth As Integer = PictureBox1.Width
'
' Open Preview window in picturebox
'
hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, _
480, PictureBox1.Handle.ToInt32, 0)
'
' Connect to device
'
If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 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, PictureBox1.Width, PictureBox1.Height, _
SWP_NOMOVE Or SWP_NOZORDER)
'btnSave.Enabled = True
'btnStop.Enabled = True
'btnStart.Enabled = False
Else
'
' Error connecting to device close window
'
DestroyWindow(hHwnd)
'btnSave.Enabled = False
End If
End Sub
Private Sub LoadDeviceList()
Dim strName As String = Space(100)
Dim strVer As String = Space(100)
Dim bReturn As Boolean
Dim x As Integer = 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 += 1
Loop Until bReturn = False
End Sub
Private Sub ClosePreviewWindow()
'
' Disconnect from device
'
SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, iDevice, 0)
'
' close window
'
DestroyWindow(hHwnd)
End Sub
Private Sub saveimage()
Dim data As IDataObject
Dim bmap As Image
Dim fs As FileStream
'
' 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)), Image)
ClosePreviewWindow()
PictureBox2.Image = bmap
Path = Application.StartupPath + "\" & TextBoxIDcard.Text & Label1.Text & LabelTime.Text.Substring(0, 1) & LabelTime.Text.Substring(6, 1) & ".bmp" ' ตั้งชื่อให้กับรูปภาพ ตามแต่สะดวก
Dim filename As String = Path
fs = New FileStream(filename, FileMode.Create)
bmap.Save(fs, System.Drawing.Imaging.ImageFormat.Bmp)
fs.Close()
End If
End Sub
End Class
Date :
2013-11-11 10:08:02
By :
tomonaha
No. 9
Guest
ผมอยากทราบวิธีที่ ปรับ pixel ของกล้องให้มีความคมชัดมากขึ้น ต้องแก้ที่จุดไหนคับ code เดียวกับ tomon เลยครับ
Date :
2014-04-28 15:01:06
By :
newname
No. 10
Guest
อยากได้เกี่ยวกับการใช้กล้องในการถ่ายรูปแล้วให้มาขึ้นในโปรแกรมนะค่ะ เหมือนที่หลายๆโรงพยาบาลนะค่ะใช้ windows form .cs นะค่ะรบกวนหน่อยนะค่ะ