Mein Code zu diesem Thema abgewandelt und auch schon recht schnell
Code: Alles auswählen
{- Information
; Folker Linstedt
;
;}/
;aus "capture.pb" und "inc.pb"
Enumeration
#Link2
#Link3
#Sprite3D
#Sprite3D2
EndEnumeration
Dim Farbe.b(4)
;- Window Constants
Global hWnd
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
Enumeration
#Button_0
EndEnumeration
Procedure Open_Window_0()
hWnd=OpenWindow(#Window_0, 0, 0, 410, 410, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "(c) Folker Linstedt 2006 - Desktop muss: 32 Bit BGR sein")
EndProcedure
#WM_CAP_START = #WM_USER
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
#WM_CAP_FILE_SAVEDIB = #WM_CAP_START + 25
#WM_CAP_SET_SCALE = #WM_CAP_START + 53
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
#WM_CAP_EDIT_COPY = #WM_CAP_START + 30
#WM_CAP_GRAB_FRAME = #WM_CAP_START+60
InitSprite()
InitSprite3D()
Rotate=0
Open_Window_0()
OpenWindowedScreen(WindowID(),0,0,400,400,0,0,0)
OpenLibrary(0, "AVICAP32.DLL")
hRobby = CallFunction(0, "capCreateCaptureWindowA", "Test", #WS_CHILD, 0, 0, 384, 288, hWnd, 0)
SendMessage_(hRobby, #WM_CAP_DRIVER_CONNECT, 0 , 0)
Sprite3DQuality(1)
CreateSprite(#Link2,128,128,#PB_Sprite_Texture)
*Pointer =AllocateMemory(128*128*4)
*Pointer2=AllocateMemory(128*128*4)
Rausch=20
Repeat
Event = WindowEvent() ; This line waits until an event is received from Windows
; WaitWindowEvent()
WindowID = EventWindowID() ; The Window where the event is generated, can be used in the gadget procedures
GadgetID = EventGadgetID() ; Is it a gadget event?
EventType = EventType() ; The event type
Link = GetClipboardData(#PB_ClipboardImage)
If Link <> 0
ClearScreen(0,0,0) ; Schwarz
StartDrawing(SpriteOutput(#Link2))
DrawImage(Link,0,0,128, 128)
*Bild=DrawingBuffer()
CopyMemory(*Bild, *Pointer, 128*128*4)
If DrawingBufferPixelFormat() = #PB_PixelFormat_32Bits_BGR : DrawText("32 Bit BGR") : EndIf
StopDrawing()
CopySprite(#Link2, #Link3, #PB_Sprite_Texture)
CreateSprite3D(#Sprite3D, #Link3)
;{- Berechnungen
;R=-10+Random(Rausch)
For i2=0 To 126 ; Bei 127 gibts noch ungeklärte Probleme
For i=0 To 127
P=127-i
Farbe(0)=PeekB(*Pointer+i2*128*4+P*4+0)
Farbe(1)=PeekB(*Pointer+i2*128*4+P*4+1)
Farbe(2)=PeekB(*Pointer+i2*128*4+P*4+2)
Farbe(3)=PeekB(*Pointer+i2*128*4+P*4+3)
Farbe(4)=(Farbe(0)+Farbe(1)+Farbe(2))/3 ; Grau ... aber irgendwie nicht richtig
;R=Random(Rausch)
PokeB(*Pointer2+i2*128*4+i*4+0, Farbe(2)+R) ; Blue
PokeB(*Pointer2+i2*128*4+i*4+1, Farbe(2)+R); Green
PokeB(*Pointer2+i2*128*4+i*4+2, Farbe(2)+R); Red ... Rot ist am hellsten
PokeB(*Pointer2+i2*128*4+i*4+3, Farbe(3)) ; Alpha
Next i
Next i2
;}- Ende Berechnungen
CopyMemory(*Pointer2, *Bild, 128*128*4)
CreateSprite3D(#Sprite3D2, #Link2)
Rotate=(Rotate+3)%360
ZoomSprite3D(#Sprite3D2,192,144)
; RotateSprite3D(#Sprite3D,Rotate,0)
Start3D()
DisplaySprite3D(#Sprite3D, 60, 60)
DisplaySprite3D(#Sprite3D2, 180, 180)
Stop3D()
EndIf
;/
SendMessage_(hRobby, #WM_CAP_GRAB_FRAME, 0 , 0)
SendMessage_(hRobby, #WM_CAP_EDIT_COPY, 0 , 0) ; SendMessage_(hRobby, #WM_CAP_EDIT_COPY ,0,0); kopiert Bild ins Clipboard
Delay(10) ; Prozessorauslastung verhindern ... vielleicht ;-)
FlipBuffers()
Until Event = #PB_Event_CloseWindow ; End of the event loop
SendMessage_(hRobby, #WM_CAP_SET_PREVIEW, 0, 0)
SendMessage_(hRobby, #WM_CAP_DRIVER_DISCONNECT, "Test", 0)
CloseWindow(0)
CloseLibrary(0)
End
Wenn man nur den DrawImage()-Befehl nutzen kann, muss man ihn wohl auf ein eigenes Bild anwenden, dieses besitzt dann alle Optionen zum 2D-Zeichnen.
Ich würd gern noch wissen, ob ich irgendwie an die Bilder der Kamera komme, ohne sie in den Clipboard-Speicher zu schreiben.
Kenn mich nur mit den ganzen WM_ ... Konstanten nicht so aus.
Und cool wäre auch ein Ansatz, wie ich meinen Code oben in der Schleife umwandeln kann, so dass ich z.B. Linien ermitteln kann in einem Bild und dessen Winkel bestimmen und deren Länge ...
Gibt's da schon was?
