AGB  ·  Datenschutz  ·  Impressum  







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

Bildgröße zur Laufzeit ändern

Ein Thema von Root2k · begonnen am 4. Jul 2011 · letzter Beitrag vom 4. Jul 2011
Antwort Antwort
blackfin
(Gast)

n/a Beiträge
 
#1

AW: Bildgröße zur Laufzeit ändern

  Alt 4. Jul 2011, 12:49
Das ist bei einem Image32 ganz einfach :

Stell im ObjektInspector einfach den ScaleMode des TImage32 auf smOptimalScaled oder smStretch, je nachdem was du willst.
(smOptimalScaled skaliert das Bild in das TImage32 hinein, während die Proportionen beibehalten werden, smStretch skaliert das Bild in die gesamte verfügbare Fläche des TImage32, ohne die Proportionen beizubehalten)

smResize gibts auch noch, wenn du das Bild grösser machen willst, als es im Original ist. (das macht smOptimalScaled nicht)
Auch smResize skaliert proportional.

Dann brauchst du per Code einfach nur noch die Grösse des Timage32 zu verändern (und nicht des internen Bitmaps!)
Die Skalierung und das Neuzeichnen macht das TImage32 dann ganz automatisch, ohne irgendwelche Kopier- oder Repaint-Routinen aufrufen zu müssen.

Delphi-Quellcode:
// Erst im Objektinspektor den ScaleMode von imageWindow auf smOptimalScaled, smStretch oder smResize stellen!
// Und dann:
procedure TForm1.btnScaleClick(Sender: TObject);
begin
  imageWindow.Height := 100;
  imageWindow.Width := 100;
end;

Geändert von blackfin ( 4. Jul 2011 um 13:03 Uhr)
  Mit Zitat antworten Zitat
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#2

AW: Bildgröße zur Laufzeit ändern

  Alt 4. Jul 2011, 13:11
Danke erstmal für alle Antworten!

@mleyen: Deine Variante scheint nicht zu funktionieren (hat einfach keine sichtbaren Auswirkungen).

@blackfin: Ok, das funktioniert zumindest wenn ich das Bild mit dem Bitmap32-Editor an Anfang direkt einfügt.
Wenn ich jetzt allerdings das Bild erst später einfügen will (weil das z.B. der Anwender machen können soll), dann haben diese Einstellungen keine Auswirkungen. D.h. ich kann das Bild so nicht skalieren.

Besteht sonst keine Möglichkeit "nur" das Bild zu skalieren und das TImage32-Objekt (mehr oder weniger) zu belassen wie es ist?

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

n/a Beiträge
 
#3

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
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#4

AW: Bildgröße zur Laufzeit ändern

  Alt 4. Jul 2011, 13:51
Naja, wenn ich es mir recht überlege gibt es eigentlich keinen Grund das TImage32-Objekt in der Größe festzulegen.

Jetzt hats grad "klick" gemacht... jetzt weiß ich wie ich meine Ideen umsetzen kann.

Vielen Dank!!

Werde es jetzt einfach so machen dass sich der (Zeichen-)Bereich meines Programmes an das jeweilige Bild anpasst (Größe).
Nur wenn das Bild zu groß ist um korrekt dargestellt zu werden mache ich eine Neuskalierung.

Thx again
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:09 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