Szenario: Ich habe eine
TImage
-Komponente auf ein Formular geworfen. Es ist ein Png-Bild. Da das Standard-Resizen eines
TImage
ziemlich hässlich aussieht wollte ich es noch einmal schöner berechnen wenn der Benutzer mit dem Resizing aufgehört hat.
Das tue ich:
(Lokale Objekte zerstören habe ich weggelassen)
Delphi-Quellcode:
uses GraphUtil;
// originalImage ist ein TPngImage was das hochaufgelöste Bild enthält
// imageComponent ist die TImage-Komponente auf dem Formular
procedure TFrame6.smoothScaledImage(const imageComponent: TImage);
var
originalBitmap: TBitmap; // Bitmap copy von originalImage (TPngImage)
resultingBitmap: TBitmap; // Bitmap-Ergebnis von GrpahUtils.ScaleImage
pngImage: TPngImage; // PNG-Konvertierung von resultingBitmap
scaleAmount: Double;
begin
originalBitmap := TBitmap.Create();
originalBitmap.SetSize(originalImage.Width, originalImage.Height);
originalBitmap.Canvas.Draw(0, 0, originalImage);
resultingBitmap := TBitmap.Create();
resultingBitmap.SetSize(imageComponent.Width, imageComponent.Height);
resultingBitmap.Transparent := True; // Das hier ist böse
if imageComponent.Height < imageComponent.Width then
scaleAmount := imageComponent.Height / originalImage.Height
else
scaleAmount := imageComponent.Width / originalImage.Width;
GraphUtil.ScaleImage(originalBitmap, resultingBitmap, scaleAmount);
pngImage := TPngImage.Create();
pngImage.Assign(resultingBitmap);
imageComponent.Picture.Assign(pngImage);
end;
Im Klartext:
- Ich kopiere das originalImage in ein Bitmap
- Ich erstelle ein transparentes Bitmap für die TImage-Komponente
- Ich skaliere das 1. Bitmap auf die Größe des 2. und schreibe es dort hinein
- Ich konvertiere das 2. Bitmap wieder nach Png (TPngImage)
- Das Png-Image wird dem Picture der Formular-Komponente zugewiesen
Nun das Problem:
Die Zeile
resultingBitmap.Transparent := True;
sorgt dafür dass später das konvertierte PNG-Bild auf dem Formular flackert wie Bolle. Auch das Skalieren sieht stellenweise extrem komisch aus.
Kann jemand erkennen, warum das so ist? Irgendwas ist mit dem erzeugten PNG-Bild falsch. Würde ein eingestelltes Beispielprojekt helfen?