![]() |
Bitmap ==> Image kopieren, Seitenverhältnis beachten
Moin, Moin.
Ich habe das Problem, ein (OffScreen) Bitmap (egal welcher Größe) in ein Image (sichtbar auf der Form) zu kopieren, das Seitenverhätlnis des Bitmaps sollte aber beibehalten werden. "Stretch" macht dies ja genau nicht. Dabei bin ich auf eine Lösung von "efg's Computer Lab" ( ![]() Hier mein Szenario: Die TImage Komponente auf der Form ist 128x305 Pixel groß. Ist nun das übergebene (und mit efg's konvertierte) Bitmap 200x200 Pixel groß, wird es prima verkleintert auf dem Image gezeigt (korrektes Seitenverhältnis). Das ist auch schön der Fall, falls das Bitmap kleiner ist: Dann wird es korrekt vergrößert. Sobald aber eine Seite des Bitmaps die magische Größe von 255 überschreitet, wird nur ein Teil des Bitmaps auf dem Image gezeichnet. (Genauer: Das umgebende Rechteck ist einfach nicht sichtbar!) Hier die Konvertierungsroutine von efg:
Delphi-Quellcode:
In der Routine wird das FromBitmap Seitenverhältnis-Gerecht in das ToImage kopiert. NewBitmap ist, wie man sehen kann eine temoräres Bitmap.
{ Display Bitmap in Image. Keep the TBitmap as large as possible in the TImage}
{ while maintaining the correct aspect ratio. ---------------------------------} PROCEDURE TMeine_Frm.DisplayBitmap(const FromBitmap: TBitmap; const ToImage: TImage); VAR Half : INTEGER; Height : INTEGER; NewBitmap : TBitmap; TargetArea: TRect; Width : INTEGER; BEGIN NewBitmap := TBitmap.Create; TRY NewBitmap.Width := ToImage.Width ; NewBitmap.Height := ToImage.Height; NewBitmap.PixelFormat := pf24bit; //NewBitmap.Canvas.Brush := ShapeFill.Brush; // ??? NewBitmap.Canvas.FillRect(NewBitmap.Canvas.ClipRect); // "equality" (=) case can go either way in this comparison IF FromBitmap.Width / FromBitmap.Height < ToImage.Width / ToImage.Height THEN BEGIN // Stretch Height to match. TargetArea.Top := 0; TargetArea.Bottom := NewBitmap.Height; // Adjust and center Width. Width := MulDiv(NewBitmap.Height, FromBitmap.Width, FromBitmap.Height); Half := (NewBitmap.Width - Width) DIV 2; TargetArea.Left := Half; TargetArea.Right := (TargetArea.Left + Width) ; END ELSE BEGIN // Stretch Width to match. TargetArea.Left := 0; TargetArea.Right := NewBitmap.Width; // Adjust and center Height. Height := MulDiv(NewBitmap.Width, FromBitmap.Height, FromBitmap.Width); Half := (NewBitmap.Height - Height) DIV 2; TargetArea.Top := Half; TargetArea.Bottom := (TargetArea.Top + Height); END; NewBitmap.Canvas.StretchDraw(TargetArea, FromBitmap); ToImage.Picture.Graphic := NewBitmap; FINALLY NewBitmap.Free END; END; Hat jemand eine Erklärung dafür, warum die Routine schlapp macht, wenn entweder FromBitmap.Height oder FromBitmap.Width > 255 ist? Vielen Dank für jedweden Hinweis Gruß Jazzman |
Re: Bitmap ==> Image kopieren, Seitenverhältnis beachten
Gib das Bitmap einfach unscaliert an das Image und stelle beim Image die Property Stretch und Proportional auf True. :stupid:
|
Re: Bitmap ==> Image kopieren, Seitenverhältnis beachten
Uj!
Erstmal: Sieht auf den ersten Blick nach einer eleganten Lösung aus. Aber: Der gleiche Effekt -- ich kann es nicht glauben! Solange Bitmap.Height oder Bitmap.Width < 258 ist alles super! Wenn eine von den beiden Seiten aber > 258 (keine Ahnung wehalb nun "258"), dann wird das umgebende Rechteck entweder garnicht oder nur teilweise gezeichent. Was ist denn da los? Völlig verwirrt. (Aber Deine Lösung zeigt, dass es wohl nicht an der Konvertierungsroutine lag -- was mich aber jetzt noch ratsloser macht...). Danke & Gruß Jazzman |
Re: Bitmap ==> Image kopieren, Seitenverhältnis beachten
Eventuell ein Fehler im Grafikkartentreiber.
Bei mir funktioniert die Methode fehlerlos. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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-2025 by Thomas Breitkreuz