我用VB6,在表單里加了一個PictureBox或者Image,用來表示攝像頭顯示所拍攝的區域,現在加了一個按鈕,拍照讓拍下來的照片顯示在這個PictureBox框里,我網上找了找,一旦拍攝啟動,感覺是呼叫資源的問題,請有做過的大牛賜教!
uj5u.com熱心網友回復:
請求大牛們幫助!uj5u.com熱心網友回復:
都不知道你怎么用的。。。。。uj5u.com熱心網友回復:
我用了網上一段程式,如下:.bas部分的代碼
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" _
Alias "capCreateCaptureWindowA" ( _
ByVal lpszWindowName As String, _
ByVal dwStyle As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hWndParent As Long, _
ByVal nID As Long) As Long
Private Const WS_CHILD = &H40000000
Private Const WS_VISIBLE = &H10000000
Private Const WM_USER = &H400
Private Const WM_CAP_START = &H400
Private Const WM_CAP_EDIT_COPY = (WM_CAP_START + 30)
Private Const WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10)
Private Const WM_CAP_SET_PREVIEWRATE = (WM_CAP_START + 52)
Private Const WM_CAP_SET_OVERLAY = (WM_CAP_START + 51)
Private Const WM_CAP_SET_PREVIEW = (WM_CAP_START + 50)
Private Const WM_CAP_DRIVER_DISCONNECT = (WM_CAP_START + 11)
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Preview_Handle As Long
Public Function CreateCaptureWindow( _
hWndParent As Long, _
Optional x As Long = 0, _
Optional y As Long = 0, _
Optional nWidth As Long = 440, _
Optional nHeight As Long = 440, _
Optional nCameraID As Long = 0) As Long
Preview_Handle = capCreateCaptureWindow("Video", _
WS_CHILD + WS_VISIBLE, x, y, _
nWidth, nHeight, hWndParent, 1)
SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, nCameraID, 0
SendMessage Preview_Handle, WM_CAP_SET_PREVIEWRATE, 30, 0
SendMessage Preview_Handle, WM_CAP_SET_OVERLAY, 1, 0
SendMessage Preview_Handle, WM_CAP_SET_PREVIEW, 1, 0
CreateCaptureWindow = Preview_Handle
End Function
Public Function CapturePicture(nCaptureHandle As Long) As StdPicture
Clipboard.Clear
SendMessage nCaptureHandle, WM_CAP_EDIT_COPY, 0, 0
Set CapturePicture = Clipboard.GetData
End Function
Public Sub Disconnect(nCaptureHandle As Long, _
Optional nCameraID = 0)
SendMessage nCaptureHandle, WM_CAP_DRIVER_DISCONNECT, _
nCameraID, 0
End Sub
放了一個表單,一個按鈕,一個picturebox控制元件,表單部分代碼:
Dim Video_Handle As Long
Private Sub Command1_Click()
Dim x As StdPicture
Set x = CapturePicture(Video_Handle)
SavePicture x, "c:\a1.bmp"
PicCapture.Visible = False
nowPic.Visible = True
nowPic.Picture = LoadPicture("c:\a1.bmp")
Image1.Picture = LoadPicture("c:\a1.bmp")
End Sub
Private Sub Form_Load()
Video_Handle = CreateCaptureWindow(PicCapture.hwnd)
nowPic.Visible = False
End Sub
Private Sub Form_Unload(Cancel As Integer)
Disconnect Video_Handle
End Sub
執行到這兩句出錯:
Set x = CapturePicture(Video_Handle)
SavePicture x, "c:\a1.bmp"
提示的錯誤是:
runtime error "521 " can't open clipboard
不知道什么原因?
uj5u.com熱心網友回復:
我的錯誤是 “380”無效屬性值uj5u.com熱心網友回復:
對于樓頂文字,我嚴重懷疑你是會打中文的老外,因為我看了三遍,完全沒看明白你在講什么,雖然字都認識.....看了3樓補充,終于讓我明白了:
原來你是因為這部分代碼有錯誤

好吧,扯遠了,中文語法問題我沒法幫你,但VB的問題還是能幫到點的:
你的錯誤是"runtime error "521 " can't open clipboard",已經講得很明白,無法打開剪貼板.
從CapturePicture()函式的實作來看,需要把截的圖放到剪貼板里再取回來,才能得到一個stdPicture物件,以便保存.
Public Function CapturePicture(nCaptureHandle As Long) As StdPicture
Clipboard.Clear
SendMessage nCaptureHandle, WM_CAP_EDIT_COPY, 0, 0
Set CapturePicture = Clipboard.GetData
End Function
至于你這代碼為什么無法打開剪貼板,你要跟到CapturePicture()內部去,搞清楚具體錯誤是在哪一行.
如果是Clipboard.Clear,那有可能是別的程式正在使用,可以嘗試用一個帶Sleep(100)的回圈去呼叫這一句,沒有錯誤的話即成功.
另外,這樣的方法不好,因為你并不需要使用到剪貼板,WM_CAP_EDIT_COPY訊息是方便在別的地方(例如QQ聊天視窗中)粘貼影像而使用的,你這里是為了保存到檔案并顯示,那使用WM_CAP_FILE_SAVEDIB訊息是最合適不過的了.
這里給你一個封裝:
Function capFileSaveDIB(ByVal hCapWnd As Long, ByVal FilePath As String) As Boolean
capFileSaveDIB = SendMessageAsString(hCapWnd, WM_CAP_FILE_SAVEDIB, 0&, FilePath)
End Function
'呼叫:
if not capFileSaveDIB(Video_Handle,"C:\a1.bmp") then
Msgbox "保存失敗!"
end if
uj5u.com熱心網友回復:
在獲取視頻的時候和獲取別的表單的時候用的API是不一樣的,以前我測驗過用普能API不能截取播放的影片的圖,后來沒再試過。用暴風和QQ可以實作。暫沒發現是什么原理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/72145.html
標籤:多媒體
上一篇:救急,看看哪里錯了,謝謝
下一篇:bIsConnected = axCZKEM1.Connect_Net("192.168.1.253", 4370);
