opBitmap - JPG zentrieren

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Jacques
Beiträge: 17
Registriert: Do 24. Mai 2007, 16:50
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von Jacques »

Hallo, ich würde gern mit Hilfe von OpBitmap ein jpg zentriert in der Mitte des Bildschirms darstellen.
Eine Absolute Positionierung von der TImage-Komponente lässt sich leider nicht machen, da ich verschiedene Bilder dynamisch laden will.
Alle Versuche sind bisher gescheitert.
Hoffe, mir kann jemand helfen. Bin zwar Lazarus-Neuling, kenne mich aber recht gut mit Delphi aus. Nur muss mein Programm später unter Linux laufen, deshalb Lazarus.

Gruß
Jacques

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Wie meinst du das, "in der Mitte des Bildschirms"?
In der Mitte des Formulars?
Das kannst du schon mit OpBitmap machen, Indem du die Dimensionen des TImage nach dem Laden des OpBitmap auf die Dimensionen des OpBitmap setzt. Bin aber nicht ganz sicher, ob das nicht auch ohne OpBitmap geht.
z.B. so Image1.Width:=Image1.Picture.Graphic.Width;

Mit OpBitmap hast du allerdings den Vorteil, dass es alle JPEG laden kann (mir ist jedenfalls noch keins untergekommen, welches sich nicht hätte öffnen lassen). LazJPEG lädt Progressive JPEG nicht.

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Da meint er wohl mehr zentriert Desktop oder Screen. Zumindest brauchst du dafür mal ein Formular, das du auf DesktopCenter einstellen mußt. Darauf muß dann ein TImage, mit AutoSize = true. Das Formular sollte ebenfalls auf AutoSize = true stehen. Dann kannst du über OpBitmap dein Image laden und auf das Bitmap von TImage kopieren. Blöde ist natürlich, das man den Header vom Formular nicht weg bekommt.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Jacques
Beiträge: 17
Registriert: Do 24. Mai 2007, 16:50
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von Jacques »

Wie ich immer wieder feststelle gehören Programmierer tatsächlich die Sparte der "Nachtaktiven" ;)
Danke schon mal für die Antworten. Hätte wohl ein wenig genauer beschreiben sollen, was ich vorliegen hab und was ich will.
Genauere Beschreibung kommt heute Nachmittag.

Gruß

Jacques

Jacques
Beiträge: 17
Registriert: Do 24. Mai 2007, 16:50
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von Jacques »

Hallo, hier nun meine etwas genauere Beschreibung:
Ich habe eine Form (die MainForm) mit den Einstellungen wsMaximized und Borderstyle "bsNone"
Somit habe ich keinerlei Icons, keine Titelleiste und den kompletten Bildschirm bedeckt. Das ist auch so gewollt.
Darauf habe ich 2 Panel. Das eine - das fällt später auch weg - enthält ein TEdit um eine Grafik-Datei einzugeben, einen Button, der die Form wieder schließ, also das Programm beendet (wird später über Mausbewegung erledigt) und einen Button der den Code ausführt (siehe weiter unten).
Das zweite Panel enthält ein TImage mit
- Center = true
- Aligne = none
- Autosize = true
Das Panel hat aligne = alClient. Das erste Panel ist auf alBottom gesetzt.
Hier nun der Code:

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
var
   MyHTTPSend : THTTPSend;
  hoehe, weite, h2, w2: integer;
begin
  MyHTTPSend := THTTPSend.Create;
  try
    if MyHTTPSend.HTTPMethod('GET',Edit1.Text) then
    try
     fOP.LoadFromStream(MyHTTPSend.Document);
      hoehe := fOP.Bitmap.Data.Height;
      weite := fOP.Bitmap.Data.width;
 
      Image1.Width := weite;
      Image1.Height := hoehe;
 
  fOP.DrawImage;
  showmessage(inttostr(Image1.Width));
  showmessage(inttostr(Image1.height));
  if Image1.Center then showmessage('mittig') else showmessage('unmittig');
  // hier wird "mittig" ausgegeben, aber das Bild erscheint trotzdem oben links in der Ecke
  showmessage(inttostr(Image1.left));
  showmessage(inttostr(Image1.top));
  Image1.Top := 100;
  Image1.Left := 100;
  showmessage(inttostr(Image1.left));
  showmessage(inttostr(Image1.top));
  // left und Top werden beide mit 0 ausgegeben, obwohl ich sie zuvor gesetzt habe
    except
      Application.MessageBox('Cannot display','Error', 0);
    end;
    except
      showMessage('nix geht');
    end;
  MyHTTPSend.Free;
end;
Auch ein Versuch, left und top entsprechend der Bildgröße/Formgröße (TForm) zu berechnen und zu setzen hatte keinen Erfolg.
Hatte auch versucht mit LazJpeg das Bild darzustellen. Funktioniert aber nicht mit jedem Bild. Mit OpBitmap wird zwar das Bild dargestellt, aber nicht an der Position, wo ich es gerne hätte.

Hoffe mir kann jemand helfen.

Gruß
Jacques

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Center bezieht sich auf die Position des Bitmap innerhalb des Image.
Wenn du das Image auf die Grösse des Bitmap setzt, kann es ja nicht zentrieren.
Also mach mit TImage:

Align:=alClient;
Center:=True;
Autosize:=False;
Stretch:=False;

und setze die Dimensionen des TImage nicht.

Uebrigens: Als "Anfänger" solltest du eher nicht auf Data zugreifen. ;-)
hoehe := fOP.Bitmap.Data.Height;
das hätte gereicht:
hoehe := fOP.Bitmap.Height;

Und es gibt noch eine Eigenschaft: UpdateImageSize in TLazOPPicture. Die musst du vielleicht noch auf false setzen.

Jacques
Beiträge: 17
Registriert: Do 24. Mai 2007, 16:50
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von Jacques »

Danke, so geht's
Hatte alles mögliche Probiert, nur nicht, das TImage einfach auf alClient zu setzen.

Gruß

Jacques

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Ah, das wäre dann MainFormCenter. Das sollte aber auch ohne Panel gehen. Dazu mußt zuerst das Image auf OpBitmap laden und dann die Größe von TImage auf die Größe von OpBitmap bringen. Dann komplett kopieren.

Dann rechnest du:

TImage.Left:= (TForm.ClientWidth div 2) - (TImage.Width div 2);
TImage.Top:= (TForm.ClientHeight div 2) - (TImage.Height div 2);

TImage.Parent:= TForm;

maximale Mißweisung 1 Pixel. Kannst natürlich auch runden.

Damit sollte der Keks geknabbert sein.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Jacques
Beiträge: 17
Registriert: Do 24. Mai 2007, 16:50
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von Jacques »

@Schnullerbacke: Danke, die andere Lösung funktioniert ja.
Bin schon zufrieden.
Ich denke, dass auch die jetztige Lösung ohne Panel funktioniert. Nur hatte ich ja noch die Buttons im unteren Bereich.

Antworten