Autor Beitrag
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: So 17.07.11 18:56 
ausblenden 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, 00);
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: So 17.07.11 22:23 
Ich habe etwas gefunden und entsprechend umgebaut, komme aber mit einem Übergabeparameter nicht hin.

ausblenden 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
    //CapCreate;
    //CapConnect;
    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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: So 17.07.11 23:01 
Muss dort nicht der Pointer hin?
SmileySN Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 17.07.11 23:17 
Du musst auf LongInt casten. ;-)

Für diesen Beitrag haben gedankt: SmileySN
SmileySN Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: So 17.07.11 23:29 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: So 17.07.11 23:35 
ausblenden 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
    //CapCreate;
    //CapConnect;
    vfs := sizeof(BITMAPINFO);
    capGetVideoFormat(PanelVideo2.Handle, LongInt(@lpBmpInfo), vfs);
    lpBmpInfo.bmiHeader.biWidth := 720;  // Horizontale Auflösung
    lpBmpInfo.bmiHeader.biHeight := 576// Vertikale Auflösung
    lpBmpInfo.bmiHeader.biBitCount := 8// Farbtiefe 8 oder 24
    lpBmpInfo.bmiHeader.biPlanes := 1;   // Einstellung der Treiberebenen. Muss 1 sein
    lpBmpInfo.bmiHeader.biClrUsed := 0;  // Maximale Anzahl der dargestellten
    lpBmpInfo.bmiHeader.biXPelsPerMeter := 0;
    lpBmpInfo.bmiHeader.biSize := 40;
    lpBmpInfo.bmiHeader.biYPelsPerMeter := 0;
    lpBmpInfo.bmiHeader.biCompression := BI_RGB; // Komprimierung (BI_RGB=keine Kompr.)
    lpBmpInfo.bmiHeader.biClrImportant := 0;     // Farben, 0=alle Farben
    lpBmpInfo.bmiHeader.biSizeImage := lpBmpInfo.bmiHeader.biWidth * lpBmpInfo.bmiHeader.biHeight *
      lpBmpInfo.bmiHeader.biBitCount div 8;        // Größe der reservierten Bytes

    capSetVideoFormat(PanelVideo2.Handle, LongInt(@lpBmpInfo), vfs);
  End;


So lässt es sich jetzt schon mal Compilieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: 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
ausblenden 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.