AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bildgröße zur Laufzeit ändern
Thema durchsuchen
Ansicht
Themen-Optionen

Bildgröße zur Laufzeit ändern

Ein Thema von Root2k · begonnen am 4. Jul 2011 · letzter Beitrag vom 4. Jul 2011
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:23 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