Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild skalieren (https://www.delphipraxis.net/96338-bild-skalieren.html)

napsterxx 22. Jul 2007 21:25


Bild skalieren
 
Sers,
Ich weiß nicht ob der Titel stimmt. Ich habe eine Anwendung, sie ist, z.B. 50 Hoch und 50 Breit, auf dem Formular dieser Anwendung habe ich ein Bild was auch 50 Hoch und 50 Briet ist. Nun möchte ich das wenn ich das Fenster maximiere, auch das Bild "wächst". Kennt da jemand so spezial Dünger ;). Also wie funktioniert das?
Ich habe dieses hier versucht >>Klick Mich<< aber das funktioniert nur eingeschränkt. Das Bild wird zwar größer, jedoch wird es ganz komisch hinter das eigentliche Bild gelegt, sodass am Ende im Vordergrund das 50 mal 50 Bild ist, und im Hintergrund das 200 zu 200 z.B.. Tja wie funktioniert das nun?

_frank_ 22. Jul 2007 21:29

Re: Bild skalieren
 
wie stellst du das bild dar?
aufgrund deiner beschreibung vermute ich mal, du hast das bitmap in einem TImage und malst wie bei der verlinkten Seite auf das Form-Canvas.

Entweder du nimmst ein TImage stellst dessen Align-Eigenschaft auf alClient und Stretched auf true, oder du malst es manuell im OnPaint des Forms auf dessen Canvas und lässt das TImage weg :)

HTH Frank

napsterxx 22. Jul 2007 21:33

Re: Bild skalieren
 
Hehe achso dann noch mal schauen. Ich habs in einem TImage und es ist ein Bitmap

//EDIT
Yeah es funktioniert. Danke für schnelle Antwort

_frank_ 22. Jul 2007 21:45

Re: Bild skalieren
 
wie hast du das nun jetzt gemacht?

ich würde das im OnPaint des forms machen:

so in etwa:

Delphi-Quellcode:
type
  TForm1...
    private
      bgbitmap:TBitmap;
...
procedure TForm1.FormCreate(...);
begin
  bgBitmap:=TBitmap.create;
  bgBitmap.loadFromfile(...); //oder loadFromResource etc.
end;

procedure TForm1.FormDestroy(...);
begin
  bgBitmap.free;
end;

procedure TForm1.FormPaint(...);
begin
  canvas.StretchDraw(rect(0,0,width,height),bgbitmap);
end;
für solche Sachen (Hintergründe) nehm ich ungern TImages, aber ist Ansichtssache :)

Gruß Frank

Namenloser 22. Jul 2007 21:52

Re: Bild skalieren
 
Dann musst du den Code bei OnResize aber auch nochmal hinschreiben, sonst wird der Hintergrund bei Verkleinerung des Formular nicht wieder kleiner.

napsterxx 22. Jul 2007 21:53

Re: Bild skalieren
 
Ich habe es mit Strech := True gemacht aber das ist total verpixelt. Bei dsdt.info stand mit einem Strech Al. kann man dsa ändern. Wie? Davon verstehe ich gar nichts. Könnt ihr mir nochmal helfen?

_frank_ 23. Jul 2007 01:41

Re: Bild skalieren
 
Zitat:

Zitat von napsterxx
Ich habe es mit Strech := True gemacht aber das ist total verpixelt.

ist doch klar, dass es pixelt...es ist eine pixelgrafik. Wenn man die über ihre ursprüngliche Größe streckt, müssen ja zusätzliche pixel rein und die passen nunmal nicht 100%ig :)
Ist doch in jedem Pixel-Grafik-Programm (Paint, Photoshop) auch so (gut, es gibt ausgefeilte Anti-Aliasing-Funktionen, aber auch die sind nicht 100%ig), evtl. mal bei http://www.efg2.com/Lab schauen.
Zitat:

Zitat von napsterxx
Bei dsdt.info stand mit einem Strech Al. kann man dsa ändern. Wie? Davon verstehe ich gar nichts. Könnt ihr mir nochmal helfen?

ein Strech-Was? :gruebel: Sagt mir so erstmal nichts...evtl. kannst du uns nen Link geben, damit wir wissen, was du meinst.
Ich weis ja nicht, was du für eine Grafik (von der Größe her) im Hintergrund haben willst, es gibts ja auch die Möglichkeit die Grafik zu kacheln (hab da irgendwo noch ein stückchen Code rumliegen, wenn Interesse besteht).
ist das nicht möglich, sollte man drüber nachdenken, das resizen des Forms evtl. gleich zu verbieten ;)

HTH Frank

napsterxx 23. Jul 2007 06:24

Re: Bild skalieren
 
Zitat DSDT.Info:
Zitat:

Wird ein Bild stark vergrößert, verschlechtert sich die Bildqualität. Um diesen Effekt zu vermeiden, können Sie optimierte Stretch-Algorithmen verwenden.
Zu finden ist dies hier.

Nuclear-Ping 23. Jul 2007 06:47

Re: Bild skalieren
 
Schau dir mal das an:
http://spotlight.de/zforen/dlp/m/dlp...1475-6567.html

Vielleicht ist das was für dich.

b1zZ 23. Jul 2007 07:16

Re: Bild skalieren
 
Guten Morgen,

hatt vor kurzem auch ein ähnliches Problem und habe mir eine Funktion dafür geschrieben, vielleicht hilft sie dir.

Delphi-Quellcode:
function ResizeImage(SourceBitMap: TBitMap; DrainWidth: Integer = 0; DrainHeight: Integer = 0;
                       KeepRatio: Boolean = true; PixelFormat :TPixelFormat = pfCustom):TBitMap;
var Rect: TRect;
    SourceHeight, SourceWidth: Integer;
    DrainBitMap: TBitMap;
begin
  DrainBitMap:= TBitMap.Create;

  SourceWidth:= SourceBitMap.Width;
  SourceHeight:= SourceBitMap.Height;

  if KeepRatio = True then
  begin
    if DrainHeight = 0 then
      DrainHeight:= Round((SourceHeight/SourceWidth)*DrainWidth)
    else
      if DrainWidth = 0 then
        DrainWidth:= Round(DrainHeight/(SourceHeight/SourceWidth));

    //Sollte das Verhältniss des Ausgangsbildes anders sein als des Zielbildes
    //wird es so verändert, dass es in sein Ausgangsverhältnis beibehält und in
    //Zielbild passt.
    if (DrainWidth/DrainHeight) > (SourceWidth/SourceHeight) then
      DrainWidth:= Round((SourceWidth/SourceHeight)*DrainHeight)
    else
      if (DrainWidth/DrainHeight) < (SourceWidth/SourceHeight) then
        DrainHeight:= Round(DrainWidth/(SourceWidth/SourceHeight));
  end;
  // Position des "kopier-Rechtecks" wird auf oben links
  // gesetzt und kopiert bis DrainWidth und DrainHeight
  Rect.TopLeft.X:= 0;
  Rect.TopLeft.Y:= 0;
  Rect.BottomRight.X:= DrainWidth;
  Rect.BottomRight.Y:= DrainHeight;
  // Das Result BitMap bekommt die gestretchte / gestauchte Grösse
  DrainBitMap.Width:= DrainWidth;
  DrainBitMap.Height:= DrainHeight;

  // Bild wird gestreckt und ins Resultbild geladen,
  // damit das Original nicht verändert wird.
  // Mit DrainBitMap wird dann weitergearbeitet
  DrainBitMap.Canvas.StretchDraw(Rect,SourceBitMap);

  // Die Farbtiefe wird geändert
  if PixelFormat <> pfCustom then
    DrainBitMap.PixelFormat:= PixelFormat;

  Result:= DrainBitMap;
end;
Habe den Code zwar Kommentiert, aber stehen für Fragen immer zur Verfügung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:23 Uhr.
Seite 1 von 2  1 2      

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