Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Image zoom beim Editieren ? (https://www.delphipraxis.net/130351-image-zoom-beim-editieren.html)

thomas2009 6. Mär 2009 22:20


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:
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);
//...
Gibt es eine andere Möglichkeit ?

jaenicke 6. Mär 2009 22:30

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).

Luckie 6. Mär 2009 23:57

Re: Image zoom beim Editieren ?
 
Zitat:

Zitat von thomas2009
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 !

Ich weiß, dass Edgar Allen Poe drei absätze lange Sätze schreiben konnte. Aber als guten Stil würde ich das nicht bezeichnen. Ein etwas intensiverer Gebrauch der Interpunktion und sauber ausformulierte Sätze würden bestimmt sehr zum Verständnis beitragen.

thomas2009 7. Mär 2009 00:46

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:
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 bei mir bei 120% zoom sieht die Lage wie im Bild
also die Linie wird so weit von dem Cursor gezeichnet :mrgreen:

Dunkel 7. Mär 2009 00:57

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.

Codewalker 7. Mär 2009 08:52

Re: Image zoom beim Editieren ?
 
Zitat:

Zitat von thomas2009
Delphi-Quellcode:
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;

Offensichtlich ist X und Y hier nicht korrekt (was ja auch beim Zoomen zu erwarten war, weil dann ein Pixel auf dem Bildschirm nicht mehr einem Pixel im Bild entspricht). Du musst also X und Y mit dem Zoomfaktor verrechnen, damit die neue Position stimmt. Mach am Besten auf Papier ein Beispiel und nimm einen dankbaren Zoomfaktor (z.B. 200%, 400%, etc. ). Ich würde auch nicht direkt mit einer Linie anfangen, sondern mit einem einzelnen gesetzten Pixel. Damit ist noch viel klarer, um wie viel du in welche Richtung daneben liegst. Und so arbeitest du Dich langsam durch das Problem (was sich wahrscheinlich auf zwei einfache Multiplikationen reduzieren wird :wink: )

thomas2009 7. Mär 2009 11:07

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.

blink182 7. Mär 2009 11:27

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:
  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;
und dann beim Trackbar-Change

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;

thomas2009 7. Mär 2009 12:08

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:

blink182 7. Mär 2009 13:11

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:
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);
bzw halt deinen zoomfaktor den du hast, bei dir wars ja 2

Delphi-Quellcode:
Image1.Width:=2*Image1.Width;
Image1.Height:=2*Image1.Height;
oder du führst ne integer variable ein, die den zoomfaktor beinhaltet, und dann teilst du die position durch den faktor ;)

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:
// 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;
dann kannst du dir das mit den variabeln sparen ;)


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