Einzelnen Beitrag anzeigen

blackfin
(Gast)

n/a Beiträge
 
#5

AW: Bildgröße zur Laufzeit ändern

  Alt 4. Jul 2011, 13:32
Zitat:
Besteht sonst keine Möglichkeit "nur" das Bild zu skalieren und das TImage32-Objekt (mehr oder weniger) zu belassen wie es ist?
Doch klar, du kannst einfach das Bitmap skaliert in das gleiche Bitmap malen.
Allerdings stehen dann beim Verkleinern die überflüssigen Bereiche noch da, was sicher unerwünscht ist.

"Sauber" kannst du das z.B. über ein temporäres Bitmap machen:
Delphi-Quellcode:
uses
...GR32, GR32_Image...


procedure TForm1.btnScaleClick(Sender: TObject);
var
  FRect : TRect ;
  FBitmap: TBitmap32 ;
begin
  FRect.Left := 0 ;
  FRect.Top := 0 ;
  FRect.Right := 100 ;
  FRect.Bottom := 100 ;

  FBitmap := TBitmap32.Create();
  FBitmap.Width := FRect.Right;
  FBitmap.Height := FRect.Bottom;

  imageWindow.Bitmap.DrawTo(FBitmap,FRect);
  imagewindow.Bitmap.Assign(FBitmap);

  FreeAndNil(FBitmap) ;
end;

Dabei ist das Bild beim Skalieren aber noch recht hässlich und hat Aliasing-Stufen.
Deswegen kannst du einen Kernel-Resampler von Graphics32 verwenden, der das Bild beim Skalieren auch "schön" aussehen lässt.

Hier das ganze nochmal mit einem Resampler und Lanczos-Kernel.
Es gibt mehrere Kernels in der GR32, wie Gaussian, Hann, Cubic etc.
Der Lanczos-Algorithmus erzeugt aber meiner Meinung nach meistens die schönsten skalierten Bilder. Je nach Anwendungsfall und Geschmack natürlich
Delphi-Quellcode:
uses
...GR32, GR32_Image, GR32_Resamplers...

procedure TForm1.btnScaleClick(Sender: TObject);
var
  FRect : TRect ;
  FBitmap: TBitmap32 ;
  FSampler: TKernelResampler ;
begin
  FRect.Left := 0 ;
  FRect.Top := 0 ;
  FRect.Right := 100 ;
  FRect.Bottom := 100 ;

  FSampler:= TKernelResampler.Create() ;
  FSampler.Kernel := TLanczosKernel.Create;

  FBitmap := TBitmap32.Create();
  FBitmap.Width := FRect.Right;
  FBitmap.Height := FRect.Bottom;

  imageWindow.Bitmap.Resampler := FSampler;
  imageWindow.Bitmap.DrawTo(FBitmap,FRect);
  imagewindow.Bitmap.Assign(FBitmap);

  FreeAndNil(FBitmap) ;
  FreeAndNil(FSampler) ;
end;

Allerdings ist das ja relativ grosser Overhead..welchen Grund gibt es, dass du das TImage32 nicht in der Grösse verändern willst?

Geändert von blackfin ( 4. Jul 2011 um 14:18 Uhr)
  Mit Zitat antworten Zitat