Einzelnen Beitrag anzeigen

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