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
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
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!"
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
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 😦
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
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...
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
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!