Seite 2 von 2

Verfasst: 15.01.2006 01:56
von Delle
Hallo Volker,

lustiges Tool, aber wie hast Du das mit der Webcam hinbekommen?

Die meisten Leute hier sind ja daran gescheitert, trotz Avicap usw.

Verfasst: 16.01.2006 09:23
von Kukulkan
Hi Delle,
lustiges Tool, aber wie hast Du das mit der Webcam hinbekommen?
Die meisten Leute hier sind ja daran gescheitert, trotz Avicap usw.
Verstehe ich nicht ganz. Im englischen Forum hab ich dazu sogar alle codes ausgetauscht (http://forums.purebasic.com/english/vie ... hp?t=17018). Ich hab diverse Hilfe dazu selbst aus diesem Forum gehabt (soweit ich mich entsinne)...

Zum Beispiel das hier:

Code: Alles auswählen

; initialize webcam 
If OpenLibrary(0, "avicap32.dll") 
  *capAddress = IsFunction(0, "capCreateCaptureWindowA") 
  hWndC = CallFunctionFast(*capAddress, "My Capture Window", #WS_CHILD | #WS_VISIBLE, 695, 12, 40, 30, WindowID(), 1) 
  SendMessage_(hWndC, #WM_CAP_DRIVER_CONNECT, KameraID.l, 0) ; connect driver 
  SendMessage_(hWndC,#WM_CAP_SET_SCALE, #True, 0) ; no stretching 
  SendMessage_(hWndC, #WM_CAP_SET_PREVIEW, #True, 0) ; start preview 
  SendMessage_(hWndC, #WM_CAP_SET_PREVIEWRATE, 50, 0) ; set preview-rate (milliseconds) 
Else 
  MessageRequester("Scotty, we have a problem...","Sorry, but I cant find or open avicap32.dll...", #MB_ICONERROR) 
EndIf 

; SOME LOOP CODE
; retrieve picture 
SendMessage_(hWndC, #WM_CAP_EDIT_COPY, 0, 0) 
img.l = GetClipboardData(#PB_ClipboardImage) 

; render result 
StartDrawing(WindowOutput()) 
DrawImage(img.l, 10, 12, 640, 480) 
StopDrawing()
; END SOME LOOP CODE
Ich gehe für KidsCam noch einen Schritt weiter und überführe das Bild in einen Memorybereich. Das mache ich mit

GetBitmapBits_(img.l, BufferSize.l, SourceBuffer.l)

Dann kann ich mit PeekB und PokeB bearbeiten und schreibe das Ergebnis in einen anderen Codebereich (ShowBuffer). Am Ende kopiere ich das dann zurück in ein Bild:

SetBitmapBits_(img.l, BufferSize.l, ShowBuffer.l)

Dann kann ich es mit DrawImage(img.l, 10, 12, 640, 480) wieder darstellen. Eine verbesserte und noch schnellere Methode findet sich noch im oben angegebenen Thread (arbeitet mit Callbacks und #WM_CAP_SET_CALLBACK_FRAME).

Volker