AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zoom in einem Canvas - Feld

Ein Thema von Dellphi · begonnen am 15. Jun 2010 · letzter Beitrag vom 16. Jun 2010
Antwort Antwort
Dellphi

Registriert seit: 5. Nov 2009
23 Beiträge
 
#1

Zoom in einem Canvas - Feld

  Alt 15. Jun 2010, 15:29
Delphi-Version: 2005
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!
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#2

AW: Zoom in einem Canvas - Feld

  Alt 15. Jun 2010, 16:47
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.
Manuel
  Mit Zitat antworten Zitat
Dellphi

Registriert seit: 5. Nov 2009
23 Beiträge
 
#3

AW: Zoom in einem Canvas - Feld

  Alt 15. Jun 2010, 16:58
DANKE!

Was empfiehlst du mir denn als einfachstes?
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Zoom in einem Canvas - Feld

  Alt 15. Jun 2010, 17:10
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 = 'BMPthen HDCImage.Picture.Bitmap.SaveToFile(dest)
  else SaveBMPasJPG(dest,HDCImage.Picture.Bitmap,qual);
  graphics.Free;
  HDCImage.Free;

end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#5

AW: Zoom in einem Canvas - Feld

  Alt 15. Jun 2010, 19:04
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.
Manuel
  Mit Zitat antworten Zitat
Dellphi

Registriert seit: 5. Nov 2009
23 Beiträge
 
#6

AW: Zoom in einem Canvas - Feld

  Alt 15. Jun 2010, 19:48
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Zoom in einem Canvas - Feld

  Alt 16. Jun 2010, 12:37
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.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  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:54 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