![]() |
Delphi-Version: 7
Problem mit Skalierung eines Bitmap im BitBtn
Hallo,
ich steh grad auf dem Schlauch. Ich lade in eine Bitmap-Variable ein Bitmap und möchte dies skaliert in einen BitBtn laden. Ich hab das Ganze mal in ein Test-Projekt ausgelagert. Das Ganze versuch ich mit StrechDraw.
Delphi-Quellcode:
Nur mit der oberen Ausführung erhalte ich gar kein Bild im BitBtn.
procedure TForm1.Button1Click(Sender: TObject);
var bmp, bmp2: TBitmap; i: Integer; i_max: Integer; i_min: Integer; begin bmp := TBitmap.Create; bmp2 := TBitmap.Create; try bmp.LoadFromFile('E:\MaskLight\Programm\Masken\Achsen_MKS.bmp'); i_max := Max(bmp.Height, BitBtn1.Height); i_min := Min(bmp.Height, BitBtn1.Height); i := i_max div i_min; BitBtn1.Glyph.Canvas.StretchDraw(Rect(0, 0, BitBtn1.Height, (BitBtn1.Width div i)), bmp2); BitBtn1.Glyph.Assign(bmp2); finally FreeAndNil(bmp); FreeAndNil(bmp2); end; end; Ersetz ich bmp2 durch bmp, dann erhalte ich zwar ein Bild im BitBtn, aber in unveränderter Größe.
Delphi-Quellcode:
Die Berechnung von i dient nur der Skalierung bei gleichbleibendem Größenverhältnis.
BitBtn1.Glyph.Canvas.StretchDraw(Rect(0, 0, BitBtn1.Height, (BitBtn1.Width div i)), bmp);
BitBtn1.Glyph.Assign(bmp); Was mach ich falsch? (Nein - nicht ich, Delphi :mrgreen:) |
AW: Problem mit Skalierung eines Bitmap im BitBtn
Welche Größe hat denn bmp2?
[edit]Vielleicht ist es hiermit einfacher:
Delphi-Quellcode:
[/edit]
procedure StretchGraphic(const src, dest: TGraphic;
DestWidth, DestHeight: integer); var temp, aCopy: TBitmap; faktor: double; begin Assert(Assigned(src) and Assigned(dest)); if src.Width > DestWidth then begin faktor := DestWidth / src.Width; if (src.Height * faktor) > DestHeight then faktor := DestHeight / src.Height; end else begin faktor := DestHeight / src.Height; if (src.Width * faktor) > DestWidth then faktor := DestWidth / src.Width; end; try aCopy := TBitmap.Create; try aCopy.PixelFormat := pf24Bit; aCopy.Assign(src); temp := TBitmap.Create; try temp.Width := round(src.Width * faktor); temp.Height := round(src.Height * faktor); SetStretchBltMode(temp.Canvas.Handle, HALFTONE); StretchBlt(temp.Canvas.Handle, 0, 0, temp.Width, temp.Height, aCopy.Canvas.Handle, 0, 0, aCopy.Width, aCopy.Height, SRCCOPY); dest.Assign(temp); finally temp.Free; end; finally aCopy.Free; end; except on E: Exception do MessageBox(0, PChar(E.Message), nil, MB_OK or MB_ICONERROR); end; end; |
AW: Problem mit Skalierung eines Bitmap im BitBtn
Zitat:
|
AW: Problem mit Skalierung eines Bitmap im BitBtn
Ich werfe dann noch eine Skalierungs-Funktion hinterher. Man sollte sowieso nicht soviele Aufgabe in eine einzelne Funktion packen.
Mit dem Ergebnis Initialisierst Du das Ziel-Bitmap. Kannst auch auf X/Y Parameter (also direkte Übergabe von Width/Height) umschreiben oder einem Rect für StretchDraw.
Delphi-Quellcode:
function ScaleSize(Size : TSize; MaxBorderLength : Integer): TSize;
var Ratio : Double; begin Ratio := Size.cx / Size.cy; if (Ratio >= 1) {Landscape} then begin Result.cx := MaxBorderLength; Result.cy := Trunc(MaxBorderLength / Ratio); end else begin Result.cy := MaxBorderLength; Result.cx := Trunc(MaxBorderLength * Ratio); end; end; |
AW: Problem mit Skalierung eines Bitmap im BitBtn
Zitat:
Delphi-Quellcode:
Du weist dem ButtonGlyph die Referenz zu deinem bmp2 zu und gibst danach dieses Objekt frei, da kann ja nix mehr angzeigt wergen. :zwinker:
BitBtn1.Glyph.Assign(bmp2);
... FreeAndNil(bmp2); > Du kannst ja mal probehalber das
Delphi-Quellcode:
auskommentieren. (bin mal gespannt, ob ich Recht hab :angle2: )
bmp2.Free;
BitBtn1.Glyph.Width und .Height setzen und dann in BitBtn1.Glyph.Canvas das Bild reinkopieren |
AW: Problem mit Skalierung eines Bitmap im BitBtn
Dann wäre aber die Methode Assign diesmal anders als üblicherweise.
|
AW: Problem mit Skalierung eines Bitmap im BitBtn
Zitat:
Inspiriert von meinem Code bin ich durch diesen ![]() Nur damit ändert sich die Größe des Bildes nicht. Zitat:
Eine Größenangabe ergab leider auch keine Veränderung, ausser dass ich im BitBtn ein weisses Feld sah. Zitat:
[edit] DeddyH´s Code funktioniert - hatte nur Width und Height verwechselt |
AW: Problem mit Skalierung eines Bitmap im BitBtn
Hmm, ich glaub ich hab da noch eine versteckte Referenzzählung gefunden, welches es intern gibt. :gruebel:
Bin aber dennoch mal gespannt, ob das Weglassen von .Free etwas bringt. Ansonsten kannst du bmp2 und Glyph mal in einer Datei speichern (SaveToFile) und nachsehn wie die enthaltenen Bilder aussehn. |
AW: Problem mit Skalierung eines Bitmap im BitBtn
Zitat:
Du lädst in bmp. Zeichnest aber bmp2. HTH W. |
AW: Problem mit Skalierung eines Bitmap im BitBtn
Ich hab jetzt nochmal ein wenig rumgespielt und bin auf folgende Lösung gekommen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var bmp, bmp2: TBitmap; begin bmp := TBitmap.Create; bmp2 := TBitmap.Create; try bmp.LoadFromFile('E:\MaskLight\Programm\Masken\Achsen_MKS.bmp'); bmp2.Width := BitBtn1.Width; bmp2.Height := BitBtn1.Height; bmp2.Canvas.StretchDraw(Rect(0, 0, bmp2.Width, bmp2.Height), bmp); BitBtn1.Glyph.Assign(bmp2); Image1.Picture.Assign(bmp2); finally FreeAndNil(bmp); FreeAndNil(bmp2); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz