Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Konvertieren eines TBitmap zu einem TPngImage tut später komische Dinge

  Alt 8. Dez 2014, 20:56
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:
  1. Ich kopiere das originalImage in ein Bitmap
  2. Ich erstelle ein transparentes Bitmap für die TImage-Komponente
  3. Ich skaliere das 1. Bitmap auf die Größe des 2. und schreibe es dort hinein
  4. Ich konvertiere das 2. Bitmap wieder nach Png (TPngImage)
  5. 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?
  Mit Zitat antworten Zitat