Autor |
Beitrag |
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: So 17.07.11 16:22
Ich zeige ein Bild von einem VideGrabber an und möchte die Standard Einstellung des VideoFormates in Pixel voreinstellen.
Eingestellt ist immer das Format 640x480 Pixel mein Grabber hat aber 720*576 Pixel.
Mit dem Aufruf von capdlgVFormat kann ich die Auflösung umstellen und alles funktioniert wunderbar.
Da ich jedoch nur die Auflösung 720*576 Pixel benötigem, möchte ich diese voreistellen.
Dazu müsste ich doch den Befehl:
function capSetVideoFormat(hwnd:THandle; s:LongInt; wSize:Word):LongInt;
benutzen können, hoffe ich.
Leider finde ich keine Erklärung der Parameter die mir sagen was sie bedeuten und was ich dort eintragen muss.
Was kann ich mit s und wSize anfangen und was gibt die Function zurück ?
Möglich, dass s ein Index auf eine Liste ist.
Dazu müsste ich dann die Liste der möglichen Auflösungen einlesen und dann daraus meine Auflösung auswählen und setzen.
Kennt sich damit jemand aus und kann mir das an einem Beispiel erklären ?
Vielen Dank
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: So 17.07.11 18:17
Hallo,
Ich habe selber schonmal mit der WinAPI gearbeitet.
Der Befehl "function capSetVideoFormat(hwnd:THandle; s:LongInt; wSize:Word):LongInt; "
bassiert vermutlich auf der Windowsnachricht "WM_CAP_SET_VIDEOFORMAT Message" (siehe msdn.microsoft.com/e...7%28v=VS.85%29.aspx)
Zu den Parametern:
hwnd:THandle -> Das Videofenster
s:LongInt -> Pointer auf eine Variable vom Typ BITMAPINFO (siehe MSDN Doku)
wSize:Word -> Die Größe Variable auf sie der Parameter s zeigt.
Die Auflösung steht dann in der BITMAPINFO Variablen.
Ich hoffe ich liege damit nun richtig.
Kannst Du eventuell den Quelltext zu der von dir verwendeten FUnktion "capSetVideoFormat" posten?
MFG
Tilo
|
|
SmileySN 
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: So 17.07.11 18:56
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function capGetVideoFormat(hwnd:THandle; s:LongInt; wSize:Word):LongInt; begin Result := SendMessage(hwnd, WM_CAP_GET_VIDEOFORMAT, wSize, s); end;
function capGetVideoFormatSize(hwnd:THandle):LongInt; begin Result := SendMessage(hwnd, WM_CAP_GET_VIDEOFORMAT, 0, 0); end;
function capSetVideoFormat(hwnd:THandle; s:LongInt; wSize:Word):LongInt; begin Result := SendMessage(hwnd, WM_CAP_SET_VIDEOFORMAT, wSize, s); end; |
Das ist aus der Datei AVICap.pas
Mal sehen ob ich den BitmapInfoHeader in irgendeiner Pascal Routine finde, dann muss ich ihn mir nicht neu erstellen.
Der müsste in den AVICap Dateien ja irgendwo definiert sein.
Dann muss ich wohl erst mal das VideoFormat lesen und dann die Werte im BitMapInfoHeader ändern und wieder wegschreiben.
Sobald ich es hinbekommen habe melde ich mich wieder.
Wenn es jemand aus einem vorhandenen Projekt heraus kopieren kann darf er das natürlich auch gerne tun.
|
|
SmileySN 
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: So 17.07.11 22:23
Ich habe etwas gefunden und entsprechend umgebaut, komme aber mit einem Übergabeparameter nicht hin.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| Procedure TForm1.SetVideoFormat; Var vfs: Word; lpBmpInfo: BITMAPINFO; Begin vfs := sizeof(BITMAPINFO); capGetVideoFormat(PanelVideo2.Handle, lpBmpInfo, vfs); <--- Hier Fehler beim zweiten Parameter lpBmpInfo lpBmpInfo.bmiHeader.biWidth := 720; lpBmpInfo.bmiHeader.biHeight := 576; lpBmpInfo.bmiHeader.biBitCount := 8; lpBmpInfo.bmiHeader.biPlanes := 1; lpBmpInfo.bmiHeader.biClrUsed := 0; lpBmpInfo.bmiHeader.biXPelsPerMeter := 0; lpBmpInfo.bmiHeader.biSize := 40; lpBmpInfo.bmiHeader.biYPelsPerMeter := 0; lpBmpInfo.bmiHeader.biCompression := BI_RGB; lpBmpInfo.bmiHeader.biClrImportant := 0; lpBmpInfo.bmiHeader.biSizeImage := lpBmpInfo.bmiHeader.biWidth * lpBmpInfo.bmiHeader.biHeight * lpBmpInfo.bmiHeader.biBitCount / 8;
capSetVideoFormat(PanelVideo2.Handle, lpBmpInfo, vfs); End; |
Die Routine capGetVideoFormat will einen Integer Parameter haben, ich muss ihr aber dort die BmpInfo übergeben, möglicherweise als Offset oder Adresse ???
|
|
Regan
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: So 17.07.11 23:01
Muss dort nicht der Pointer hin?
|
|
SmileySN 
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: So 17.07.11 23:07
Ja das ist richtig er erwartet die Adresse der BitmapInfo Structur
Wenn ich @lpBmpInfo schreibe nimmt er das aber auch nicht, da er einen Integer erwartet.
Wenn ich nur lpBmpInfo rein schreibe sollte ja die Variable by reference übergeben werden, was er ja eigentlich auch will, da es aber als Integer definiert ist nimmt er keinen Pointer.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 17.07.11 23:17
Du musst auf LongInt casten. 
Für diesen Beitrag haben gedankt: SmileySN
|
|
SmileySN 
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: So 17.07.11 23:29
Delphi-Quelltext 1:
| capGetVideoFormat(PanelVideo2.Handle, lpBmpInfo AS LongInt, vfs); |
So funktioniert es auch nicht,
[DCC Fehler] Main.pas(615): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
auch nicht mit "@lpBmpInfo As LongInt"
[DCC Fehler] Main.pas(615): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
|
|
glotzer
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: So 17.07.11 23:31
capGetVideoFormat(PanelVideo2.Handle, LongInt(@lpBmpInfo), vfs);
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
Zuletzt bearbeitet von glotzer am So 17.07.11 23:48, insgesamt 1-mal bearbeitet
Für diesen Beitrag haben gedankt: SmileySN
|
|
SmileySN 
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: So 17.07.11 23:35
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| Procedure TForm1.SetVideoFormat; Var vfs: Word; lpBmpInfo: BITMAPINFO; Begin vfs := sizeof(BITMAPINFO); capGetVideoFormat(PanelVideo2.Handle, LongInt(@lpBmpInfo), vfs); lpBmpInfo.bmiHeader.biWidth := 720; lpBmpInfo.bmiHeader.biHeight := 576; lpBmpInfo.bmiHeader.biBitCount := 8; lpBmpInfo.bmiHeader.biPlanes := 1; lpBmpInfo.bmiHeader.biClrUsed := 0; lpBmpInfo.bmiHeader.biXPelsPerMeter := 0; lpBmpInfo.bmiHeader.biSize := 40; lpBmpInfo.bmiHeader.biYPelsPerMeter := 0; lpBmpInfo.bmiHeader.biCompression := BI_RGB; lpBmpInfo.bmiHeader.biClrImportant := 0; lpBmpInfo.bmiHeader.biSizeImage := lpBmpInfo.bmiHeader.biWidth * lpBmpInfo.bmiHeader.biHeight * lpBmpInfo.bmiHeader.biBitCount div 8; capSetVideoFormat(PanelVideo2.Handle, LongInt(@lpBmpInfo), vfs); End; |
So lässt es sich jetzt schon mal Compilieren
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 17.07.11 23:46
Um das vielleicht noch einmal klarzumachen:
Der Operator as ist dafür gedacht, dass bei einem Objekt geprüft wird, ob der Zieltyp in dessen Vererbungshierarchie vorkommt. Zum Beispiel, wenn man bei einem Ereignis in Sender einen Button übergeben bekommt. Dann kann man den mit as auf TButton casten und dies wird fehlschlagen, wenn in Sender gar kein TButton drin liegt.
Da du hier einen einfachen Datentyp und keine Klasse als Zieltyp hast, musst du deshalb hart (ohne Prüfung) casten.
|
|
SmileySN 
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: So 17.07.11 23:56
Danke nochmal Sebastian, du warst wie immer eine große Hilfe.
Dank auch an Glotzer für die Hilfe.
Das Programm funktioniert im Prinzip, stellt aber das Format nicht um, das muss ich dann morgen mal weiter verfolgen.
|
|
SmileySN 
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Mo 25.07.11 11:36
Ich komme leider noch nicht weiter, es kommen keine Werte zurück in Bitmapinfo.
Selbst wenn ich nur die größe von Bitmapinfo zur Übergabe feststellen möchte mit dem Befehl
Delphi-Quelltext 1:
| vfs:=longint(getvideoformatsize(PanelVideo2.Handle)); |
bekomme ich immer nur 0 zurückgeliefert,
obwohl der Treiber installiert ist und die Anzeige des Videos im PanelVideo2 auch funktioniert.
In einem Forum habe ich gelesen, dass man capgetvideoformat (sendmessage(WM_CAP_GET_VIDEOFORMAT,0,0) 2 mal aufrufen muss,
einmal mit 0 (um die Größe der Bitmapinfo-Variablen zu bekommen) und einmal mit dem Pointer der Bitmapinfo-Variablen um die Werte übergeben zu bekommen.
aber beriets der erste Aufruf mit (sendmessage(WM_CAP_GET_VIDEOFORMAT,0,0) liefert schon 0 zurück.
|
|