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
Antwort Antwort
Root2k

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

Bildgröße zur Laufzeit ändern

  Alt 4. Jul 2011, 12:43
Hallo,

gleich mal vorweg: Ich habe zu meinem Problem schon im Internet gesucht, aber leider keine Lösung gefunden. Weiterhin ist zu sagen dass ich mit Delphi sehr wenig Erfahrung habe und mich hier gerade erst einlerne.

Folgendes habe ich bereits gemacht:
- Neue Form angelegt
- Drag&Drop: TImage32-Objekt + Laden eines Bildes (über Bitmap32-Editor)

Jetzt will ich die Größe des Bildes zur Laufzeit ändern. D.h. das Bild soll also größer oder kleiner dargestellt werden, als es tatsächlich ist. Ich will also nicht die tatsächliche Größe des Bildes (auf dem Speichermedium) ändern, sondern ich will das Bild in meiner Anwendung (temporär) neu skalieren.

Ich hab das jetzt über verschiedene Wege versucht, aber leider wird das Bild jedes Mal schwarz wenn ich es neu skalieren will.

Hab hierzu mal eine kleine Beispielanwendung geschrieben.
Am Anfang wird hier ein Bild geladen und auch korrekt angezeigt. Wenn ich jetzt auf den angelegten Button klicke wird der Anzeigebereich zwar auf die 100x100 Pixel skaliert, aber das Bild ist nur noch schwarz.

Kann mir einer sagen was ich hier machen muss damit das Bild skaliert angezeigt wird?
Hab langsam echt kein Plan mehr was ich noch probieren könnte.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GR32_Image, StdCtrls, Buttons, JvExButtons, JvButtons;

type
  TForm1 = class(TForm)
    imageWindow: TImage32;
    btnScale: TJvHTButton;
    procedure btnScaleClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.btnScaleClick(Sender: TObject);
begin
  imageWindow.Bitmap.Height := 100;
  imageWindow.Bitmap.Width := 100;
end;

end.
Ausgabe:
http://imageshack.us/photo/my-images/811/vorher.jpg/
http://imageshack.us/photo/my-images/228/danach.jpg/

PS: Mit den Methoden Repaint, Resized, Refresh, etc. hab ichs auch schon probiert, aber die haben mir auch nicht weitergeholfen.
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Bildgröße zur Laufzeit ändern

  Alt 4. Jul 2011, 12:47
ungetestet:
Delphi-Quellcode:
procedure TForm1.btnScaleClick(Sender: TObject);
begin
  StretchBlt(imageWindow.Bitmap.Canvas.Handle, 0, 0, 100, 100, imageWindow.Bitmap.Canvas.Handle, 0, 0, imageWindow.Bitmap.Width, imageWindow.Bitmap.Height, SRCCOPY);
  imageWindow.Bitmap.Height := 100;
 imageWindow.Bitmap.Width := 100;
end;
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#3

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
 
#4

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
 
#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
Root2k

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

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


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 15:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz