Laden...

Image Zoom

Erstellt von naseweis vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.208 Views
N
naseweis Themenstarter:in
104 Beiträge seit 2007
vor 16 Jahren
Image Zoom

Ich habe eine Methode geschrieben, mit der ich in ein Bild rein- und rauszoomen kann.
Dazu verwende ich eine picturebox in einem panel und zoome durch das MouseWheel event des Forms.

Wie schaffe ich es, dass das Bild nicht einfach nur größer und kleiner wird (was schon toll funktioniert), sondern der Punkt unter dem Cursor auch unter dem Cursor bleibt?
Ich schaffe es einfach nicht den Left- und Top-Wert der picturebox vernünftig zu setzen ohne dass hin und wieder "wilde" Sprünge des Bild vorkommen. schäm

Gelöschter Account
vor 16 Jahren

hallo

mal so'n tipp, poste doch mal deinen code.......
damit kann man meißt mehr anfangen

MfG janismac

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo naseweis,

die Berechnung ist doch einfacher Dreisatz.

Besser ist es vielleicht eine PictureBox mit PictureBoxSizeMode.SizeMode auf ein Panel mit AutoScroll zu packen und dann AutoScrollPosition zu setzen.

herbivore

363 Beiträge seit 2007
vor 16 Jahren

Also genau der selbe Punkt kann beim zoomen garnicht unter dem Cursor bleiben.
Was geht ist das du die Position des Cursors relativ zum Rand berechnest und das dann auf das neue Bild umsetzt.

Gruß Cookiie

"Hail to the King, Baby!"

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Cookiie,

Also genau der selbe Punkt kann beim zoomen garnicht unter dem Cursor bleiben.

ist die Frage, wie du Punkt definierst. Im mathematischen Sinne ist das schon möglich.

herbivore

N
naseweis Themenstarter:in
104 Beiträge seit 2007
vor 16 Jahren

Wie wäre das mit dem Dreisatz zu verstehen?

Mittlerweile wollte ich mich schon mit dem Zentrieren der Picturbox zufrieden geben, aber irgendwie schein es mit

picBox.Left = Convert.ToInt32((panel.Width - picBox.Width) / 2);
picBox.Top = Convert.ToInt32((panel.Height - picBox.Height) / 2);

in der panel_Resize() nicht so ganz zu funktionieren. Beim Verkleinern des Panels scheint es zu funktionieren, beim Vergrößern des Panels allerdings nicht.

Hätte nie gedacht, dass das Zoomen so schwer ist 😦

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo naseweis,

Wie wäre das mit dem Dreisatz zu verstehen?

du weißt schon, Dreisatz, die Sache, die man in der (Grund-)Schule lernt. 🙂

herbivore

N
naseweis Themenstarter:in
104 Beiträge seit 2007
vor 16 Jahren

Häh, dieser Dreisatz soll hier anwendbar sein?

Da ich das Image jedesmal neu zeichne (in voller Auflösung mit steigender Auflösungsqualität) und kein StretchImage oder so verwende ist ein Pixel im vergrößerten Bild ja nicht einfach

neuesPixel.X = altesPixel.X + (alteImageWidth - neueImageWidth);
neuesPixel.Y = altesPixel.Y + (alteImageHeight - neueImageHeight);

Ich bin echt schon komplett durcheinander vor ständigem Herumprobieren...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo naseweis,


using System;
using System.Windows.Forms;
using System.Drawing;

//*****************************************************************************
public class Canvas : Form
{
   //--------------------------------------------------------------------------
   private PictureBox _picbCanvas;

   //------------------------------------ --------------------------------------
   int _iZoom;

   //==========================================================================
   public Canvas ()
   {
      Control ctrlCurr;

      Text = "PictureBox";
      ClientSize = new Size (640, 480);
      FormBorderStyle = FormBorderStyle.Fixed3D;

      //-----------------------------------------------------------------------
      ctrlCurr = _picbCanvas = new PictureBox ();
      ((PictureBox)ctrlCurr).Image = (Bitmap)Image.FromFile (@"zoom.gif");
      ((PictureBox)ctrlCurr).SizeMode = PictureBoxSizeMode.Zoom;
      ctrlCurr.MouseDown += new MouseEventHandler (CanvasMouseDown);
      Controls.Add (ctrlCurr);

      SetStartPos ();
   }

   //==========================================================================
   protected void SetStartPos ()
   {
      _picbCanvas.Size = _picbCanvas.Image.Size;
      _iZoom = 1;

      _picbCanvas.Left   = _picbCanvas.Parent.ClientSize.Width  / 2 - _picbCanvas.Width  / 2;
      _picbCanvas.Top    = _picbCanvas.Parent.ClientSize.Height / 2 - _picbCanvas.Height / 2;
   }

   //==========================================================================
   protected void CanvasMouseDown (Object objSender, MouseEventArgs e)
   {

      if (_picbCanvas.Width > 4000) {
         SetStartPos ();
         return;
      }

      _picbCanvas.Size += _picbCanvas.Image.Size;
      int iOldZoom = _iZoom;
      ++_iZoom;
      int iNewZoom = _iZoom;

      // Hier:
      _picbCanvas.Left = e.X + _picbCanvas.Left - (e.X / iOldZoom * iNewZoom);
      _picbCanvas.Top  = e.Y + _picbCanvas.Top  - (e.Y / iOldZoom * iNewZoom);;

   }
}

//*****************************************************************************
static class App
{
   public static void Main (string [] astrArg)
   {
      Application.Run (new Canvas ());
   }
}

herbivore

N
naseweis Themenstarter:in
104 Beiträge seit 2007
vor 16 Jahren

Wow, funktioniert einwandfrei!
Muss gestehen, dass ich darauf nicht gekommen wäre.

Ich möchte mich überhaupt einmal bei herbivore für seine blitzschnellen und hilfreichen Antworten bedanken!