Monday, August 28, 2006

โปรเจค SnapShot V1.0

เมื่อประมาณต้นเดือนที่ทำงานซื้อกล้อง WebCam มา 1 ตัว เห็นเค้าบอกว่าจะนำมากล้องที่ซื้อ
มาใช้ร่วมกับโปรแกรม mrecord ของบริษัท PS Solution . .

ทีแรกผมก็เข้าใจว่า อ้อ . . ที่ระบุเสปคของกล้องคงเพราะกล้องสามารถใช้กับโปรแกรมได้เลย
แต่เอาเข้าจริงสรุปว่าให้ใช้กล้องถ่ายรูปเป็น JPG , BMP แล้วทำการ Import เข้าฐานข้อมูล
ด้วยการ Browse จากโปรแกรมของ Mrecord

ผมก็เลยไปค้นหาข้อมูลเกี่ยวกับการเขียนโปรแกรมต่อกล้อง Digital บน MS Windows ดู
สรุปว่าก็ไปเจอ WIN32API ที่สามารถนำมาใช้งานได้

เนื่องด้วยผมต้องพัฒนาให้โปรแกรมใช้งานบน Windows 98/ME และเสปคคอมฯ ที่ค่อนข้างต่ำ
จึงทำให้ผมตัดสินใจเลือกใช้ Visual Basic 6.0 มาใช้งานเนื่องจากคงเหมาะกว่าจะใช้ .net
แต่แน่นอนว่าเมื่อมีเวลาผมจะพัฒนาด้วย C#.net แต่ไม่รู้เมื่อไร ..

คอมพิวเตอร์ที่ใช้รันโปรแกรม ( เฉพาะ OS และ Ram )
- MS Windows 98/ME/XP
- RAM 128 MB Share VGA 32MB หรือ 8MB

สำหรับ WIN32API ที่เรานำมาใช้ใน โปรเจคนี้จะมีทั้งหมด 2 ตัวคือ
- user32
- apicap32.dll

ตัวอย่าง CODE ( ส่วนของค่าคงที่ และ การเรียกใช้ DLL )
Const ws_visible = &H10000000
Const ws_child = &H40000000
Const WM_USER = 1024
Const WM_CAP_EDIT_COPY = WM_USER + 30
Const wm_cap_driver_connect = WM_USER + 10
Const wm_cap_set_preview = WM_USER + 50
Const wm_cap_set_overlay = WM_USER + 51
Const WM_CAP_SET_PREVIEWRATE = WM_USER + 52
Const WM_CAP_SEQUENCE = WM_USER + 62
Const WM_CAP_SINGLE_FRAME_OPEN = WM_USER + 70
Const WM_CAP_SINGLE_FRAME_CLOSE = WM_USER + 71
Const WM_CAP_SINGLE_FRAME = WM_USER + 72
Const DRV_USER = &H4000
Const DVM_DIALOG = DRV_USER + 100
Const PREVIEWRATE = 30

Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" _
Alias "capCreateCaptureWindowA" (ByVal a As String, _
ByVal b As Long, _
ByVal c As Integer, _
ByVal d As Integer, _
ByVal e As Integer, _
ByVal F As Integer, _
ByVal g As Long, _
ByVal h As Integer) As Long

Dim hwndc As Long
Dim saveflag As Integer
Dim pictureindex As Integer
Dim filter1(-1 To 1, -1 To 1) As Single
Dim filter2(-1 To 1, -1 To 1) As Single
Dim temp As String

ตัวอย่าง CODE ( การบันทึกภาพ )
Dim bRet As Boolean
Dim szTest As String

'szTest = App.Path & "\scCapture.bmp" & Chr$(0)
szTest = App.Path & "\Capture\" + FileName + ".jpg" & Chr$(0)
bRet = SendMessage(hwndc, WM_CAP_EDIT_COPY, 0&, 0&)

If bRet Then
DoEvents
If Clipboard.GetFormat(vbCFBitmap) Then
PicWCam.Picture = Clipboard.GetData(vbCFBitmap)
SavePicture PicWCam.Image, szTest
DoEvents
Clipboard.Clear
End If
End If

ตัวอย่าง CODE ( Form Load )
On Error GoTo handler:
hwndc = capCreateCaptureWindow("CaptureWindow", _
ws_child Or ws_visible, _
0, _
0, _
PicWCam.Width, _
PicWCam.Height, _
PicWCam.hWnd, _
0)
If (hwndc <> 0) Then
temp = SendMessage(hwndc, wm_cap_driver_connect, 0, 0)
temp = SendMessage(hwndc, wm_cap_set_preview, 1, 0)
temp = SendMessage(hwndc, WM_CAP_SET_PREVIEWRATE, PREVIEWRATE, 0)

temp = SendMessage(Me.hWnd, WM_CAP_EDIT_COPY, 1, 0)
PicWCam.Picture = Clipboard.GetData
Else
MsgBox "ไม่สามารถติดต่อกล้องได้", vbCritical
End If
Exit Sub
handler:
End

สิ้นสุดคร๊าบบ . . . นั้นเป็นส่วนประกอบหลักๆในการใช้ Connect ไป WebCam และบันทึกภาพ
( Note กันลืมน่ะครับ )

1 comment:

Anonymous said...

ใช้ได้เลย ไม่ต้องมาเขียน อะไรเพิ่มแล้ว ใช้ได้มาต้องนานหลายปีแล้ว นะครับ Import โดยการ Browse, Scan และก็ ถ่ายเก็บเลย