![]() |
Image zoom beim Editieren ?
Hallo
Es is mit Sicherheit wichtig beim Zeichnen auf Image mit Zoom zu arbeiten Ich kann zum Beispiel mit diesem Code das Image zoomen aber wenn ich versuche auf das Image danach zu zeichnen, dann zeichne ich wo anderes und nicht wo ich den Cursor angeklickt habe !
Delphi-Quellcode:
Gibt es eine andere Möglichkeit ?
var
StartImgWidth, StartImgheight : Integer; begin StartImgWidth:=Image1.Picture.Width; StartImgheight:=Image1.Picture.height; Image1.Stretch:=True; Image1.autosize:=False; Image1.Width:=Trunc(StartImgWidth * TrackBar1.Position / 10); Image1.Height:=Trunc(StartImgHeight * TrackBar1.Position / 10); //... |
Re: Image zoom beim Editieren ?
Wie meinst du das? Was du vor hast habe ich jetzt nicht so ganz verstanden.
Um ein Bild in anderer Größe woanders zu zeichnen gibt es StretchDraw (Delphi) oder StretchBlt (API). |
Re: Image zoom beim Editieren ?
Zitat:
|
Re: Image zoom beim Editieren ?
Liste der Anhänge anzeigen (Anzahl: 1)
Was ist nicht klar ?
Der zoom-Code ist komplet da Ok, dann versuch mal eine Freihandlinie auf Image nach dem Zoom zu zeichnen :
Delphi-Quellcode:
Also bei mir bei 120% zoom sieht die Lage wie im Bild
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); begin Canvas.LineTo(X, Y); end; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.MoveTo(X, Y); end; also die Linie wird so weit von dem Cursor gezeichnet :mrgreen: |
Re: Image zoom beim Editieren ?
Du kennst den Unterschied zwischen Absolut und Inkremental? Via TImage.Stretch & TImage.AutoSize wird das inkrementale Koordinatensystem neu gesetzt (so, dass Dein Image in den Anzeigebereich passt und diesen voll ausfüllt). Die Mauskoordinaten werkeln aber nach wie vor auf der absoluten Ebene (Du klickst auf 100,100 - die absolute Koordinaten werden ins "gestrechte" Koordinatensystem umgerechnet - ein entsprechender Versatz ist zu bemerken).
Manuelles Umrechnen wird Dir nicht erspart bleiben. |
Re: Image zoom beim Editieren ?
Zitat:
|
Re: Image zoom beim Editieren ?
Liste der Anhänge anzeigen (Anzahl: 3)
Hier ist mein Delphi Projekt, vielleicht könnte jemand mein Problem gut verstehen und mit mit einem Vorschlag helfen :-D
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls; type TForm1 = class(TForm) Image1: TImage; Button2: TButton; Button1: TButton; procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; pt: TPoint; Image1WidthOrg,Image1HeightOrg : Integer; implementation {$R *.dfm} procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if ssLeft in Shift then begin Image1.Canvas.LineTo(X, Y); end; end; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin image1.Canvas.Pen.Color:=ClRed; image1.Canvas.Pen.Width:=3; image1.Canvas.MoveTo(X, Y); end; procedure TForm1.Button2Click(Sender: TObject); begin Image1.Stretch:=True; Image1.autosize:=False; Image1.Width:=2*Image1.Width; Image1.Height:=2*Image1.Height; Button2.Enabled:=false; Button1.Enabled:=true; end; procedure TForm1.Button1Click(Sender: TObject); begin Image1.Stretch:=True; Image1.autosize:=False; Image1.Width:=Image1WidthOrg; Image1.Height:=Image1HeightOrg; Button1.Enabled:=false; Button2.Enabled:=true; end; procedure TForm1.FormCreate(Sender: TObject); var bmp: TBitmap; begin bmp:=TBitmap.Create; bmp.width:=Image1.Width; bmp.Height:=Image1.Height; Image1.Picture.Bitmap.assign(bmp); Image1WidthOrg:=Image1.Width; Image1HeightOrg:=Image1.Height; bmp.Free; end; end. |
Re: Image zoom beim Editieren ?
hiho,
als wir in der Schule unser Navi programmiert haben, haben wir sowas auch gebraucht. Wir haben das bisschen anders gelöst. Wir haben eine Karte in ein Image geladen und mit copyrect in ein anderes kopiert. Ist jetzt nicht unbedingt der sauberste code, aber es hat funktioniert :) Hierbei haben wir dann jeweils den Zoom um 30 Pixel in jede Richtung verwirklicht. Für dich dürfte Faktorx und faktory am wichtigsten sein.
Delphi-Quellcode:
und dann beim Trackbar-Change
Map: TImage;
rectkopie,recteinf:Trect; MMX,MMY,MX,MY,track,zentrpos:integer; //zoomfaktor function faktorx(trackbarposition,image1width:integer):extended; begin faktorx:=(60*(10-trackbarposition)+ image1width) / (image1width); end; //zoomfaktor function faktory(trackbarposition,image1height:integer):extended; begin faktory:=(60*(10-trackbarposition)+ image1height) / (image1height); end; procedure punktsetzen(faktx,fakty:extended); begin with form1 do begin map.canvas.ellipse((trunc(MX*faktx)+rectkopie.left-5), (trunc(MY*fakty)+rectkopie.top-5), (trunc(MX*faktx)+rectkopie.left+5), (trunc(MY*fakty)+rectkopie.top+5 )); end; end; procedure zoomin; begin with form1 do begin rectkopie.top:=rectkopie.top+30; rectkopie.bottom:=rectkopie.bottom-30; rectkopie.left:=rectkopie.left+30; rectkopie.right:=rectkopie.right-30; end; end; procedure zoomout; begin with form1 do begin if rectkopie.top-30<0 then rectkopie.bottom:=rectkopie.bottom+60 else begin if rectkopie.bottom+30>1283 then rectkopie.top:=rectkopie.top-60 else begin rectkopie.bottom:=rectkopie.bottom+30; rectkopie.top:=rectkopie.top-30; end; end; if rectkopie.left-30<0 then rectkopie.right:=rectkopie.right+60 else begin if rectkopie.right+30>2790 then rectkopie.left:=rectkopie.left-60 else begin rectkopie.right:=rectkopie.right+30; rectkopie.left:=rectkopie.left-30; end; end; end; end; procedure rechteckverschiebung; begin with form1 do begin rectkopie.top:=rectkopie.top+(MMY); rectkopie.bottom:=rectkopie.bottom+(MMY); rectkopie.left:=rectkopie.left+(MMX); rectkopie.right:=rectkopie.right+(MMX); end; end; procedure randabfrage; begin with form1 do begin if rectkopie.top+MMY<0 then if MMY<0 then MMY:=0; if rectkopie.bottom+MMY>1283 then if MMY>0 then MMY:=0; if rectkopie.left+MMX<0 then if MMX<0 then MMX:=0; if rectkopie.right+MMX>2790 then if MMX>0 then MMX:=0; end; end; procedure anzeigeaktualisieren; begin with form1 do anzeige.canvas.copyrect(recteinf,map.canvas,rectkopie); end;
Delphi-Quellcode:
procedure TForm1.ZoomChange(Sender: TObject);
var i:integer; begin //Abfrage ob zoom-out if zoom.position-track<0 then begin //Wenn die veränderung größer als 1 ist, dann wird auch mehr als einmal gezoomt. for i:=0 to track-zoom.Position-1 do begin //Zoom Out zoomout; //Anzeige Aktualisierung anzeigeaktualisieren; end; end else //Abfrage ob Zoom-in if zoom.position-track>0 then begin //Wenn die veränderung größer als 1 ist, dann wird auch mehr als einmal gezoomt. for i:=0 to zoom.Position-track-1 do begin //Zoom-In zoomin; //Anzeige aktualisieren anzeigeaktualisieren; end; end; track:=zoom.position; end; |
Re: Image zoom beim Editieren ?
Liste der Anhänge anzeigen (Anzahl: 1)
Dein Code geht wie ich sehe um eine Luppe. Das ist etwas anderes
Allerdings der Code funktioniert bei mir nicht. Ich erhalte ein weißes Rechteck ! Wie gesagt, ich möchte nicht nur zoomen sondern auf den gezoomten Bereich zeichnen :wink: |
Re: Image zoom beim Editieren ?
also,
am besten führst du noch ne boolean variable iszoom oder so ein und wenn die true ist dann
Delphi-Quellcode:
bzw halt deinen zoomfaktor den du hast, bei dir wars ja 2
if ssLeft in Shift then begin
Image1.Canvas.LineTo(X div 2, Y div 2); end; image1.Canvas.Pen.Color:=ClRed; image1.Canvas.Pen.Width:=3; image1.Canvas.MoveTo(X div 2,Y div 2);
Delphi-Quellcode:
oder du führst ne integer variable ein, die den zoomfaktor beinhaltet, und dann teilst du die position durch den faktor ;)
Image1.Width:=2*Image1.Width;
Image1.Height:=2*Image1.Height; und wenn die false ist bleibts halt so wie du es hattest ;) Edit: was du auch noch machen kannst ist beim Button1 und Button2 klicken :
Delphi-Quellcode:
dann kannst du dir das mit den variabeln sparen ;)
// Button2
Image1.Width:=2*Image1.Width; Image1.Height:=2*Image1.Height; image1.picture.bitmap.height:=image1.height; image1.picture.bitmap.width:=image1.width; //Button1 Image1.Width:=Image1WidthOrg; Image1.Height:=Image1HeightOrg; image1.picture.bitmap.height:=image1.height; image1.picture.bitmap.width:=image1.width; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 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