![]() |
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! |
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.
|
AW: Zoom in einem Canvas - Feld
DANKE!
Was empfiehlst du mir denn als einfachstes? |
AW: Zoom in einem Canvas - Feld
unter verwendung von GDI+ (free)
![]() 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; |
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.
|
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. |
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 02:31 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