Bilder(TPicture) auf TImage Größe skalieren, wie ?
-
Hallo also ich mache ein art Galerie mit edm BC++ und bin eigentlich nun mit allem fertig bis auf :
Die Bilder, die ich in der Thumbnail-Vorschau angezeigt werden, werden wenn sie recht groß sind kaum angezeigt, da nur die obere Ecke, sagen wir mal die obere/linke Ecke mit dem Ausschnitt 160x160 angezeigt.
Die ist aber natürlich nicht sinnvoll. Angezeigt werden bmb(TPicture)/jpges(TJPEG) und gifs mit (TGIFIMAGE).
Nun die Frage :
Wie schaffe ich es, das die Bilder auf dei Größe des TImage, praktisch ihres Container skaliert werden un am anfang maximal für das richitge Seitenverhältnis beschnitten werden.
Der code sollte am besten nachedm greifen, wenn das Image schon in das TPicture geladen wird.
Also
TPicture mypic = new TPicture(this); . . loading pic . . SIZINGSo brauche ich das ganze nur hinter meine Bild-Lade funktionen zu setzen.
Danke im voraus
-
Schau dir mal die Eigenschaft Stretch von TImage an (dadurch wird das Bild aber nur optisch kleiner dargestellt). Wenn das Bild auch physisch kleiner sein soll, musst du das runterskalieren mit entsprechenden Algorithmen.
-
Hi,
Stretch habe ich schon länger entdeckt, zeigt bei mir aber keinerlei Wirkung.
Wenn ich stretch auf true setze und ein Bild lade, passiert nichts.Gibt es da noch andere Einstellungen/Möglichkeiten ?
Danke
-
wenn du Stretch auf true und AutoSize auf false setzt, sollte bei einer grössen änderung des TImage das Bild sich automatisch anpassen/verzerren.
ist jedenfalls bei mir soBigNeal
-
Für alle die auf diesen Thread stoßen...
Ja du hast bestimmt recht, wenn man das Bild über LoadFromFile/FormStream lädt.
Nur dann wird das Bidl angepasst.Ich muss jedoch eine eigene Ladefunktion nutzen um bmps, jpgs und gifs laden zu können.
Dabei wird das Bild in Picture->Bitmap gemalt (Canvas), nachdem es davor in einem temporören TPicture geladen wurde.
Die Lösung war nun, das ich das ganze nicht mit Picture->Canvas->Draw zeichne sondern mit StretchDraw.
TPicture *TempPic = new TPicture; AnsiString pic_type = (ExtractFileExt(Filepath)).LowerCase(); if(pic_type == ".bmp" || pic_type == ".gif") { TempPic->LoadFromFile(Filepath); } else if(pic_type == ".jpg" || pic_type == ".jpeg") { TJPEGImage *JPEGImage = new TJPEGImage; JPEGImage->LoadFromFile(Filepath); TempPic->Assign(JPEGImage); } this->Picture->Bitmap->Height = this->Height; this->Picture->Bitmap->Width = this->Width; // getting Pic proportions and setting the height/width for proportional StretchDraw double prop = double(double(TempPic->Height) / double(TempPic->Width)); double pic_height; double pic_width; if(prop > 1) { //hochformat pic_height = this->Height; pic_width = double( double(this->Width)/prop); } else { //Querformat pic_height = double( double(this->Height)*prop); pic_width = this->Width ; } // to center the image.. long set_pic_Top = 0; long set_pic_Left = 0; int difheigth = this->Height - pic_height; int difwidth = this->Width - pic_width; if(difwidth > 0) set_pic_Left = difwidth/2; if(difheigth > 0) set_pic_Top = difheigth/2; TRect ARect; ARect.Left = set_pic_Left; ARect.Top = set_pic_Top; ARect.Right = pic_width+set_pic_Left; ARect.Bottom = pic_height+set_pic_Top; // fullsize image this->backup_pic->Bitmap->Width =TempPic->Width; this->backup_pic->Bitmap->Height=TempPic->Height; this->backup_pic->Bitmap->Canvas->Draw(0,0,TempPic->Graphic); // showed picture this->Picture->Bitmap->Canvas->StretchDraw(ARect,TempPic->Graphic);Hier ein kleiner Codeausschnitt um es besser verständlich zu machen.
Hoffe es hilft jemandem