Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zoom in einem Canvas - Feld (https://www.delphipraxis.net/152216-zoom-einem-canvas-feld.html)

Dellphi 15. Jun 2010 14:29

Delphi-Version: 2005

Zoom in einem Canvas - Feld
 
Hallo, ich habe früher in der Schule Informatik-Unterricht gehabt und alte Dateien bei mir auf dem Pc gefunden und fange nun an, wieder ein bisschen zu programmieren. Besinders mein altes Paint-Programm hat es mir angetan. Es konnte nur Freihandzeichnen, ich habe es um einige Funktionen erweitert.

Nun möchte ich einen Zoom einbauen, aber mir fehlt leider jegliche Kentnis, wie ich in einem Canvas-Feld zoomen kann, ich hatte erst die Idee eine Trackbar zu nehmen, mit der man den Zoom einstellen kann und wenn man auf den Button Zoom klickt sollte das gezoomte Canvas-Feld auf dem alten Canvas-Feld erscheinen.

Wie bekomme ich also einen Zoom in Canvas hin?

Vielen Dank im Vorraus!

H4ndy 15. Jun 2010 15:47

AW: Zoom in einem Canvas - Feld
 
Du musst das Bild nehmen und mit einen Skalierungsalgorithmus hochrechnen und das Ergebnis dann Zeichnen. Verfahren gibt es viele welche sich in Qualitaet, Geschwindigkeit und Komplexitaet unterscheiden, z.B. Pixelwiederholung, Lanzos, Supersampling, bilineare Interpolation, Bikubische Interpolation, etc. pp.

Dellphi 15. Jun 2010 15:58

AW: Zoom in einem Canvas - Feld
 
DANKE!

Was empfiehlst du mir denn als einfachstes?

Bummi 15. Jun 2010 16:10

AW: Zoom in einem Canvas - Feld
 
unter verwendung von GDI+ (free)
http://www.progdigy.com }

mit sehr guten Ergebnissen

Delphi-Quellcode:

uses  GDIPAPI, GDIPOBJ;



Procedure ScaleImage(Const source,dest:String;DestWidth,DestHeight:Integer;Qual:Integer=92;WithOutMargins:Boolean=false;BgColor:TColor=ClWhite);
var
  HDCImage:TImage;
  graphics : TGPGraphics;
  image: TGPImage;
  width, height: Integer;
  faktor:Double;
  destx,desty:Double;
  Ext:String;
begin

  Ext := UpperCase(StringReplace(ExtractFileExt(dest),'.','',[]));
  image:= TGPImage.Create(source);
  width := image.GetWidth;
  height := image.GetHeight;
  if (DestWidth / width) < (DestHeight/Height) then faktor := (DestWidth / width) else faktor:= (DestHeight/Height);
  HDCImage:=TImage.Create(nil);
  if WithOutMargins then
    begin
    HDCImage.Width := Trunc(faktor * width);
    HDCImage.Height := Trunc(faktor * height);
    destx := 0;
    desty := 0;
    end
  else
    begin
    HDCImage.Width:=DestWidth;
    HDCImage.Height:=DestHeight;
    destx := (DestWidth - faktor * width) / 2;
    desty := (DestHeight - faktor * Height) / 2
    end;
  if BgColor<>clWhite then
    begin
      HDCImage.Canvas.Brush.Color:=BgColor;
      HDCImage.Canvas.Fillrect(Rect(0,0,HDCImage.Width,HDCImage.Height));
    end;
  graphics := TGPGraphics.Create(HDCImage.Canvas.Handle);
  graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
  {
  rct.x := destx ;
  rct.Y := desty * 1.0;
  rct.Width := faktor * width;
  rct.Height := faktor * height;
  graphics.SetClip(rct);
  }
  graphics.DrawImage(
    image,
    MakeRect(destx, desty , faktor * width, faktor * height), // destination rectangle
    0, 0,       // upper-left corner of source rectangle
    width,      // width of source rectangle
    height,     // height of source rectangle
    UnitPixel);
  image.Free;
  HDCImage.invalidate;
  ForceDirectories(ExtractFilePath(dest));
  if ext = 'BMP' then HDCImage.Picture.Bitmap.SaveToFile(dest)
  else SaveBMPasJPG(dest,HDCImage.Picture.Bitmap,qual);
  graphics.Free;
  HDCImage.Free;

end;

H4ndy 15. Jun 2010 18:04

AW: Zoom in einem Canvas - Feld
 
Ansonsten, wenn du es selber programmieren willst, ist die Pixelwiederholung die einfachste Methode, erlaubt aber nur das Skalieren um ein ganze vielfache, also keine stufenloses Zoomen. z.B. 2x2 pixel zu 3x3, 4x4, etc., da du keine Interpolation stattfindet.

Dellphi 15. Jun 2010 18:48

AW: Zoom in einem Canvas - Feld
 
danke bummi, lässt du due prozedur einfach über nen button aufrufen mit ner scale oder wie machst du das? ich finde, dass ist echt gut.


ja, ich denke ich werde mich mal an der idee von H4ndy versuchen.

Bummi 16. Jun 2010 11:37

AW: Zoom in einem Canvas - Feld
 
Ich verwende es für eine Multithreaded Kommandozeilenanwednung die recursiv über ini-Dateien gesteuert previewbilder für Bilder erstellt.

Aber Du kannst es umbauen wie Du es brauchst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:05 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