AGB  ·  Datenschutz  ·  Impressum  







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

Image zoom beim Editieren ?

Ein Thema von thomas2009 · begonnen am 6. Mär 2009 · letzter Beitrag vom 7. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
thomas2009
(Gast)

n/a Beiträge
 
#1

Image zoom beim Editieren ?

  Alt 6. Mär 2009, 22:20
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.349 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Image zoom beim Editieren ?

  Alt 6. Mär 2009, 22:30
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).
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Image zoom beim Editieren ?

  Alt 6. Mär 2009, 23:57
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
thomas2009
(Gast)

n/a Beiträge
 
#4

Re: Image zoom beim Editieren ?

  Alt 7. Mär 2009, 00:46
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
Miniaturansicht angehängter Grafiken
drawinig_by_zoom_597.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Dunkel
Dunkel

Registriert seit: 26. Mär 2007
Ort: Klingenstadt
541 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Image zoom beim Editieren ?

  Alt 7. Mär 2009, 00:57
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.
Es ist zu wahr um schön zu sein...
  Mit Zitat antworten Zitat
Alt 7. Mär 2009, 08:34     Erstellt von nuclearping
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Mpüssen diese pesönlichen Diffamierungen denn _wirklich_ sein? ... Meine Güte...
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Image zoom beim Editieren ?

  Alt 7. Mär 2009, 08:52
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 )
Thomas
  Mit Zitat antworten Zitat
thomas2009
(Gast)

n/a Beiträge
 
#7

Re: Image zoom beim Editieren ?

  Alt 7. Mär 2009, 11:07
Hier ist mein Delphi Projekt, vielleicht könnte jemand mein Problem gut verstehen und mit mit einem Vorschlag helfen
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.
Angehängte Dateien
Dateityp: pas unit1_979.pas (2,0 KB, 11x aufgerufen)
Dateityp: dfm unit1_189.dfm (871 Bytes, 9x aufgerufen)
Dateityp: dpr project2_532.dpr (188 Bytes, 8x aufgerufen)
  Mit Zitat antworten Zitat
blink182

Registriert seit: 19. Jun 2007
126 Beiträge
 
Delphi 5 Standard
 
#8

Re: Image zoom beim Editieren ?

  Alt 7. Mär 2009, 11:27
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;
  Mit Zitat antworten Zitat
thomas2009
(Gast)

n/a Beiträge
 
#9

Re: Image zoom beim Editieren ?

  Alt 7. Mär 2009, 12:08
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
Miniaturansicht angehängter Grafiken
zoom2_132.jpg  
  Mit Zitat antworten Zitat
blink182

Registriert seit: 19. Jun 2007
126 Beiträge
 
Delphi 5 Standard
 
#10

Re: Image zoom beim Editieren ?

  Alt 7. Mär 2009, 13:11
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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