TImage anpassen
-
Hallo Leute,
ich hab auf meiner Form ein TImage und lade da zur Laufzeit nacheinander verschiedene Bilder hinein.
Ich hätte jetzt gerne, dass das Bild dem TImage Feld angepasst wird.
Ich habe es schon mit Stretch probiert, aber dadurch wird ja (wie der Name schon sagt) das Bild eventuell verzerrt. Ich hab auch schon mit Align und Anchors rumgespielt, habe es aber noch nicht geschafft.Kann mir bitte jemand helfen.
PS:Gibt es da vielleicht auch eine Möglichkeit Scollbars hinzuzufügen?
Kiki
-
Hallo
Wie soll denn das Bild dem Image angepasst werden, wenn dir Stretch nicht zusagt?
Scrollbars erreichst du einfach, indem du das TImage in ein TScrollBox legst und bei dem TImage Align = alClient einstellst.
bis bald
akari
-
Proportional=true;
-
@Morris Szyslak: Wo befindet sich dies "Proportional" Variable?
@akari: Danke, werde ich gleich mal versuchen.
-
@akari: Also das mit der Scollbox funktiniert leider nicht. Ich denke fast, dass es daran liegt, dass ich die Bilder erst zur Laufzeit in das Image lade.
Wenn ich das Image nicht auf alClient setze und dann in der ScollBox verschiebe könne ich mir die ScollBalken erzwingen, sonst habe ich sie aber leider nicht. Und wenn ich dann zur Laufzeit ein Bild lade habe ich wieder nur den rechten oberen Teil.

Hoffe ich habe mich verständlich ausgedrückt.
-
Hallo
das mit der Scrollbox geht schon, du must nur nach dem Laden des neuen Bitmaps noch die Eigenschaften TImage::Heigth und TImage::Width mit den Werten des neuen Bitmaps aktualisieren (TImage::Picture::Bitmap::Height bzw ::Width)
bis bald
akari
-
So was hab ich mir schon gedacht und bereits ein bisschen rum probiert.
Also ich hab jetzt mal folgenden Code:
Image->Picture->LoadFromFile(bild); Image->Height=Image->Picture->Graphic->Height; Image->Width=Image->Picture->Graphic->Width;...ich dachte ich muss Graphic nehmen da es sich bei meinem Bild um ein *.jpg Datei handelt. (habe es aber auch mit bitmap probiert)
Leider funktioniert es immernoch nicht. Ich habe auch ein Image->Update() gemacht, es passiert aber leider immernoch nichts.Muss ich in der ScollBox vielleicht noch irgendeine Einstellung machen?
EDIT1:
Ich habe den Fehler gefunden, kann ihn aber leider nicht beheben.
Also ich kann die zwei Variablen Image->Width bz. Height nicht größer machen, wie meine ScollBox ist!?Edit2:
Habe den Fehler behoben. Man darf im Image die Eigenschaft alClient nicht setzen, da sonst die Breite und höhe automatisch gesetzet sind!
-
Hallo
sorry das liegt an der Align-Einstellung. Die muß bei dieser Sache nun doch alNone sein (bzw alles außer alClient).
bis bald
akari
-
jo habe ich auch soeben bemerkt.
Kannst du mir vielleicht auch sagen wo ich diese Proportional-Variable finden kann. (Tipp von Morris Szyslak)
Glaube fast, dass mir sowas lieber wäre.
Also dass ich immer dieselbe Größe habe und dass das Bild dann proportional hineinverkleinert bzw. vergrößert wird. Also nicht wie bei der Option Stretch verzerrt wird.Kiki
-
Hallo
zumindestens im Builder 5 gibts das (noch) nicht.
bis bald
akari
-
ah ok. Trotzdem danke für die Info.
Und danke für die Hilfe mit der ScollBox.THX Kiki
-
Versuch mal das hier:
Image1 und ScrollBox1 sollten klar sein. BitmapShow ist das Bild, das in dem Image dargestellt werden soll (TBitmap). Sollte sich auch ohne Probleme auf TJPEGImage anpassen lassen.
TRect ar; double factor_x; double factor_y; double factor; factor_x = (double) BitmapShow->Width / (double) ScrollBox1->ClientWidth; factor_y = (double) BitmapShow->Height / (double) ScrollBox1->ClientHeight; factor = factor_x > factor_y ? factor_x : factor_y; ar.top = 0; ar.left = 0; ar.right = BitmapShow->Width / factor; ar.bottom = BitmapShow->Height / factor; // Darstellung des Bitmaps Image1->Picture->Assign(NULL); Image1->Top = 0; Image1->Left = 0; Image1->Width = ar.right; Image1->Height = ar.bottom; Image1->Proportional = false; Image1->Canvas->StretchDraw(ar, BitmapShow); if (Image1->Height < ScrollBox1->ClientHeight) // vertikal zentrieren? Image1->Top = (ScrollBox1->ClientHeight - Image1->Height) / 2; else Image1->Top = 0; if (Image1->Width < ScrollBox1->ClientWidth) // hozizontal zentrieren? Image1->Left = (ScrollBox1->ClientWidth - Image1->Width) / 2; else Image1->Left = 0;
-
Proportional ist eine Eigenschaft von TImage im BCB6.
-
Ob diese Eigenschaft soviel nützt? Damit kann man z.Bsp. ein Bild nicht vergrößern. Joes Methode scheint mir da geeigneter.
-
hm...
Image->Proportional=true;
Image->Stretch=true;
Image->Align=alClient;Vergrößert und verkleinert bei mir ganz gut. Wenn ich Joe_M.s Code richtig verstehe, tut er so ziemlich das gleiche.
-
Ja ist es. So wie ich es verstanden hab, geht es hier um den BCB 5, da gab es wohl die Proportional-Eigenschaft noch nicht.
-
Du verwendest Proportional doch auch.

Das kannst du natürlich auch weglassen.
Meine Aussage bezog sich auf folgenden Text aus der BCB6-HilfeSetzen Sie Proportional auf true, damit die Grafik vollständig im TImage-Steuerelement angezeigt wird und keine Verzerrungen wie bei der Eigenschaft Stretch vorkommen. Grafiken, die zu groß für das Steuerelement sind, werden solange skaliert (wobei das Bildseitenverhältnis beibehalten wird), bis sie in dem Steuerelement vollständig angezeigt werden können. Zu kleine Grafiken werden in der normalen Größe dargestellt. Proportional kann Grafiken verkelinern, aber nicht vergrößern.
-
Ups, ja richtig... Hätte ich rauslöschen sollen. Das Codeschnipsel stammt aus einer Routine, mit der man die Bilder, unter anderem, auch ein- und auszoomen kann.
-
Danke für eure Antworten. War seit Mi im verlängerten WE-Urlaub und kann deshalb erst jetzt antworten. Also das Code-Beispiel von Joe_M. find ich richtig gut. Hab da aber leider noch ein kleines Problem:
BitmapShow->Width erkennt mein Complier net. Aber wenn mich nicht alles täuscht sind das die Daten des Bilds selber. Deshlab habe ich das einfach durch: Image->Picture->Graphic->Height ersetzt.
Dadurch hab ich dann auch keine Fehler mehr.
Problem ist dann nur, dass ich ein weißes Bild habe. die Größe passt er mir aber immer an und in der StatusZeile bekomme ich auch den Dateinamen angezeigt. Ich habs auch schonmal mit Image->Refresh() versucht, hat aber leider auch nicht geholfen.Hier mal mein Code:
void TMainProg::Bild_laden(AnsiString bild) { Image->Picture->LoadFromFile(bild); StatusBar->Panels->Items[0]->Text="Aktuell angezeigtes Bild: " + bild.SubString(bild.LastDelimiter("\\")+1,bild.Length()); //Bild anpassen TRect ar; double factor_x; double factor_y; double factor; factor_x = (double) Image->Picture->Graphic->Width / (double) ScrollBox1->ClientWidth; factor_y = (double) Image->Picture->Graphic->Height / (double) ScrollBox1->ClientHeight; factor = factor_x > factor_y ? factor_x : factor_y; ar.top = 0; ar.left = 0; ar.right = Image->Picture->Graphic->Width / factor; ar.bottom = Image->Picture->Graphic->Height / factor; // Darstellung des Bitmaps Image->Picture->Assign(NULL); Image->Top = 0; Image->Left = 0; Image->Width = ar.right; Image->Height = ar.bottom; Image->Canvas->StretchDraw(ar, Image->Picture->Graphic); if (Image->Height < ScrollBox1->ClientHeight) // vertikal zentrieren? Image->Top = (ScrollBox1->ClientHeight - Image->Height) / 2; else Image->Top = 0; if (Image->Width < ScrollBox1->ClientWidth) // hozizontal zentrieren? Image->Left = (ScrollBox1->ClientWidth - Image->Width) / 2; else Image->Left = 0; Image->Refresh(); }Hoffe ihr könnt mir nochmal helfen.
Kiki
-
Das liegt an der Image->Picture->Assign(NULL). Dort wird das 'alte' Bild gelöscht, bevor das neue eingefügt wird. Laß die Zeile einfach mal raus.