opBitmap - JPG zentrieren
-
- 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:
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
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
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.
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.
-
- 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
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)
(Ringelnatz)
-
- 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:
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:
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
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;
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
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.
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.
-
- 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
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.
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)
(Ringelnatz)