Bild auf Maximal verfügbare Fläche - Seitenverhältnisse!

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
redplug
Beiträge: 31
Registriert: So 22. Nov 2009, 20:35

Bild auf Maximal verfügbare Fläche - Seitenverhältnisse!

Beitrag von redplug »

Hi,
Ich möchte ein Bild zentriert auf die Maximal verfügbare Fläche eines Panels Skalieren unter Einbeihalt vorgegebener Seiten Verhältnisse.
Hier mein Ansatz:

Code: Alles auswählen

procedure SetImage(Aspect1, Aspect2: Integer);
var
  Width, Height: Integer;
begin
  Width := Form1.Panel1.Height div Aspect2 * Aspect1;
  Height := Form1.Panel1.Width div Aspect1 * Aspect2;
  Form1.Panel2.Width := Width;
  Form1.Panel2.Height := Height;
  Form1.Panel2.Left := (Form1.Panel1.Width - Form1.Panel2.Width) div 2;
  Form1.Panel2.Top := (Form1.Panel1.Height - Form1.Panel2.Height) div 2;
end;
 
procedure TForm1.Panel1Resize(Sender: TObject);
begin
  SetImage(4, 3);
end;
Zum Test habe ich das mit 2 unterschiedlich Farbigen Panels gemacht.
Sieht eigentlich gut aus.
Nur wenn ich ein Image darauf setze das alClient hat dann sieht man das beim Resize teile des Bildes in den nicht sichtbaren Bereich verloren gehen. (Das Bild ist ein mPlayer und skaliert das Bild natürlich auf die Größe)

Hat wer ne Idee was an meiner Rechnung falsch ist?

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Bild auf Maximal verfügbare Fläche - Seitenverhältnisse!

Beitrag von Euklid »

Hallo,

mir sind zwei Dinge nicht richtig klar: Zum einen die Bedeutung von Aspect1 und Aspect2; zum anderen, weshalb du die Left- und die Top-Eigenschaft des Panels verstellst...
Ev. kannst du ja mal einen Screenshot, der dein Problem zeigt, anhängen.

Gruß, Euklid

redplug
Beiträge: 31
Registriert: So 22. Nov 2009, 20:35

Re: Bild auf Maximal verfügbare Fläche - Seitenverhältnisse!

Beitrag von redplug »

Also das Aspekt ist z.b. 4:3
Ein Tv Bild hat die z.b. größe 4:3
Also z.b.
Höhe 300px
Breite 400px
Wenn ich jetzt dieses TV Bild auf einem Panel darstelle dann möchte ich das es diese Seitenverhältnisse einhält.
z.b. Das Panel ist 500px breit und 300px hoch.
Das größte gemeinsamme ist also:
Höhe 300px
Breite 400px
wenn ich das Bild auf
500 x 300 skaliere dann ist das nicht mehr ein Verhältniss von 4:3.
Jetzt soll das auch zentriert sein.
Also auf der Rechten Seite ein 50px breiten Streifen und auf der Rechten seite ein 50px Breiten Streifen.
Deswegen bewege ich das Bild.


Bilder des Fehlers:

http://bilderspace.de/bild.php/9868,num3pngR75CG.png" onclick="window.open(this.href);return false;
http://bilderspace.de/bild.php/9869,num2pngT1CVD.png" onclick="window.open(this.href);return false;
http://bilderspace.de/bild.php/9870,num1pngOVRXZ.png" onclick="window.open(this.href);return false;

CPU-Quaeler
Beiträge: 36
Registriert: So 17. Aug 2008, 00:04

Re: Bild auf Maximal verfügbare Fläche - Seitenverhältnisse!

Beitrag von CPU-Quaeler »

Ich weiss nicht genau, was für einen Zusammenhang Panel2 mit Panel1 hat, aber wie wäre es, wenn du die begrenzende Seite wählst und die andere Entsprechend anpasst? In deinem Code sehe ich nämlich nicht, was überprüft, ob du zu viel Höhe oder zu viel Breite durch das Panel1 vorgibst. Versuch mal den Code-Vorschlag:

Code: Alles auswählen

procedure SetImage(Aspect1, Aspect2: Integer);
var
  Width, Height: Integer;
begin
  //Erst rausfinden, ob die Höhe oder die Breite beschränkend ist. If=height beschränkend. Else=width beschränkend
  If Form1.panel1.width>Form1.panel1.height * Aspect1 div Aspect2 then width:=Form1.panel1.height*Aspect1 div Aspect2 else width:=Form1.panel1.width;
  //Die höhe ergibt sich immer aus der auf Beschränkung überprüften Breite.
  Height:=Width* Aspect1 div Aspect2
  //Den Rest kann man eigentlich so lassen
  Form1.Panel2.Width := Width;
  Form1.Panel2.Height := Height;
  Form1.Panel2.Left := (Form1.Panel1.Width - Form1.Panel2.Width) div 2;
  Form1.Panel2.Top := (Form1.Panel1.Height - Form1.Panel2.Height) div 2;
end;

redplug
Beiträge: 31
Registriert: So 22. Nov 2009, 20:35

Re: Bild auf Maximal verfügbare Fläche - Seitenverhältnisse!

Beitrag von redplug »

Also bei deiner Berechnung die ich jetzt so umgesetzt habe bleibt der mPlayer nur ein kleines Kästchen.

Code: Alles auswählen

if (form1.PanelPlayerReal.Width > (Form1.PanelPlayerReal.Height * Aspect1 div Aspect2)) then
    Width := Form1.PanelPlayerReal.Height * Aspect1 div Aspect2
  else
    Width := Form1.PanelPlayerReal.Width;
  Height := Width * Aspect1 div Aspect2;
  Form1.PanelPlayerReal.Width := Width;
  Form1.PanelPlayerReal.Height := Height;
  Form1.PanelPlayerReal.Left := (Form1.PanelPlayerMax.Width - Form1.PanelPlayerReal.Width) div 2;
  Form1.PanelPlayerReal.Top := (Form1.PanelPlayerMax.Height - Form1.PanelPlayerReal.Height) div 2;
Weil immer noch nicht klar ist was Panel1 (hier PanelPlayerMax) und Panel2 (hier PanelPlayerReal) ist.
Panel1 oder auch PanelPlayerMax ist der Bereich den der User an seine gewünschte Größe anpassen kann. Wenn er das macht hat Panel1 aber nicht mehr unbedingt die Seitenverhältnisse von 4:3.
Wenn ich jetzt den Mediaplayer da das ganze Panel1 nutzen lasse wird das TV Bild verzogen. (z.b. Breite köpfe usw^^)
Deshalb habe ich auf dem Panel1 ein Panel2 (hier PanelPlayerReal). Dieses Panel2 soll immer die Maximal Mögliche Größe unter einbehalt der Seitenverhältnisse 4:3 haben damit das TV Bild nicht verzogen wird.
Mein Code von ganz oben (oder der hier - besser zu lesen wegen der Namen der Panels) hat das auch etwa gemacht. Nur verzieht sich das Bild immer so komisch wie man in den Bildern sieht.

Code: Alles auswählen

Form1.PanelPlayerReal.Width := Form1.PanelPlayerMax.Height div Aspect2 * Aspect1;
  Form1.PanelPlayerReal.Height := Form1.PanelPlayerMax.Width div Aspect1 * Aspect2;
  Form1.PanelPlayerReal.Left := (Form1.PanelPlayerMax.Width - Form1.PanelPlayerReal.Width) div 2;
  Form1.PanelPlayerReal.Top := (Form1.PanelPlayerMax.Height - Form1.PanelPlayerReal.Height) div 2;

CPU-Quaeler
Beiträge: 36
Registriert: So 17. Aug 2008, 00:04

Re: Bild auf Maximal verfügbare Fläche - Seitenverhältnisse!

Beitrag von CPU-Quaeler »

Also bei deiner Berechnung die ich jetzt so umgesetzt habe bleibt der mPlayer nur ein kleines Kästchen.
Ja, ist ja auch klar. Das hier wird ja auch nicht gehen:

Code: Alles auswählen

if (form1.PanelPlayerReal.Width > (Form1.PanelPlayerReal.Height * Aspect1 div Aspect2)) then
    Width := Form1.PanelPlayerReal.Height * Aspect1 div Aspect2
  else
    Width := Form1.PanelPlayerReal.Width;
  Height := Width * Aspect1 div Aspect2;
  Form1.PanelPlayerReal.Width := Width;
  Form1.PanelPlayerReal.Height := Height;
  Form1.PanelPlayerReal.Left := (Form1.PanelPlayerMax.Width - Form1.PanelPlayerReal.Width) div 2;
  Form1.PanelPlayerReal.Top := (Form1.PanelPlayerMax.Height - Form1.PanelPlayerReal.Height) div 2;
aber ich meinte es eher so vorhin:

Code: Alles auswählen

if (form1.PanelPlayerMax.Width > (Form1.PanelPlayerMax.Height * Aspect1 div Aspect2)) then
    Width := Form1.PanelPlayerMax.Height * Aspect1 div Aspect2
  else
    Width := Form1.PanelPlayerMax.Width; //Edit 15:33
  Height := Width * Aspect1 div Aspect2;
  Form1.PanelPlayerReal.Width := Width;
  Form1.PanelPlayerReal.Height := Height;
  Form1.PanelPlayerReal.Left := (Form1.PanelPlayerMax.Width - Form1.PanelPlayerReal.Width) div 2;
  Form1.PanelPlayerReal.Top := (Form1.PanelPlayerMax.Height - Form1.PanelPlayerReal.Height) div 2;
Edit: Zum Festlegen des kleinen 4:3 Fensters muss man sich ja am großen orientieren und nicht am kleinen Fenster selbst, sonnst beißt sich die Katze in den Schwanz :-) Wenn du aber auf meinen obigen Beitrag genau schaust, habe ich da schon zum testen der Verhältnisse das Panel1 als Grundlage genommen. Beim umsetzen hast du aber das Panel2 als Referenz genommen, was ja nicht geht.
Zuletzt geändert von CPU-Quaeler am Mi 23. Dez 2009, 15:36, insgesamt 1-mal geändert.

redplug
Beiträge: 31
Registriert: So 22. Nov 2009, 20:35

Re: Bild auf Maximal verfügbare Fläche - Seitenverhältnisse!

Beitrag von redplug »

Also entweder bin ich Blöd oder ich weiß auch nicht.
Mit deiner korrigierten Rechnung ist es das gleiche Ergebnis wie gerade eben.

Ich verstehe auch nicht ganz wie du darauf kommst das so zu machen.

CPU-Quaeler
Beiträge: 36
Registriert: So 17. Aug 2008, 00:04

Re: Bild auf Maximal verfügbare Fläche - Seitenverhältnisse!

Beitrag von CPU-Quaeler »

redplug hat geschrieben:Also entweder bin ich Blöd oder ich weiß auch nicht.
Mit deiner korrigierten Rechnung ist es das gleiche Ergebnis wie gerade eben.

Ich verstehe auch nicht ganz wie du darauf kommst das so zu machen.
Da ist auch noch ein Fehler drin ^^, sorry. Du musst natürlich im Else-Teil dich auch auf den max-Panel und nicht auf den Real-Panel beziehen, dann müsste es aber gehen, sonst fress ich einen Besen :mrgreen:
Ich werde das mal in meinem vorhergehenden Posting mal korrigieren.

Wie ich drauf komme? Ich will im If-Teil feststellen, ob man mehr Breite hat, als Höhe*Seitenverhältnis. Wenn dem so ist, ist die höhe der limitierende Faktor. Daher gehe ich dabei von der Höhe aus und errechne die dazu passende Breite, was ja in dem Fall auf jeden Fall gehen sollte, da ich genug Breite habe. Bin ich im Else-Teil, weiß ich, dass ich im Verhältnis nicht genug Breite habe und nehme mir daher das maximale an Breite, was da ist.

redplug
Beiträge: 31
Registriert: So 22. Nov 2009, 20:35

Re: Bild auf Maximal verfügbare Fläche - Seitenverhältnisse!

Beitrag von redplug »

Funktionieren tut es...
jedoch gibt es damit die selben Probleme wie bei meinem Beispiel.

ich verstehe nicht weshalb.
Ich hänge mal das Projekt an. Das sagt mehr als Tausend Worte. (mPlayer Komponente muss Installiert sein - Wenn keine TV Karte vorhanden dann den MPlayerControl1.Filename in irgendeine Mediendatei ändern)
Dateianhänge
player3.tar.gz
(246.83 KiB) 65-mal heruntergeladen

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Bild auf Maximal verfügbare Fläche - Seitenverhältnisse!

Beitrag von Euklid »

Hallo,

bezüglich dieses Codes:
redplug hat geschrieben:

Code: Alles auswählen

procedure SetImage(Aspect1, Aspect2: Integer);
var
  Width, Height: Integer;
begin
  Width := Form1.Panel1.Height div Aspect2 * Aspect1;
  Height := Form1.Panel1.Width div Aspect1 * Aspect2;
  Form1.Panel2.Width := Width;
  Form1.Panel2.Height := Height;
Ich sehe ein Problem darin, dass Width und Height gleichzeitig angepasst werden.

Daher würde ich mal folgendes probieren:

Code: Alles auswählen

procedure SetImage(Aspect1, Aspect2: Integer);
var
  Width, Height: Integer;
begin
  If Form1.Panel1.Width >= Form1.Panel1.Height div Aspect2 * Aspect1 then
  begin
    Width := Form1.Panel1.Height div Aspect2 * Aspect1;
    Height := Form1.Panel1.Height;
  end else
  begin
    Width := Form1.Panel1.Width;
    Height:= Form1.Panel1.Width div Aspect1 * Aspect2;
  end;
  Form1.Panel2.Width := Width;
  Form1.Panel2.Height := Height;
Kannst ja mal rückmelden, ob Dein Problem so behoben wird.

Viele Grüße, Euklid

Antworten