Zoomen eines Bildes mit dem Mauszeiger mithilfe von Transformationen
In diesem Szenario wird versucht, ein Bild mit dem Mauszeiger zu zoomen (skalieren). Mausposition mithilfe von Transformationen im Paint-Ereignis, um den Bitmap-Ursprung in die Mausposition zu übersetzen und dann das Bild zu skalieren und seinen Ursprung zu verschieben zurück.
Problem:
Plattform:
Relevanter Code Blöcke:
private void trackBar1_Scroll(object sender, EventArgs e) { // Get rotation angle ang = trackBar1.Value; pnl1.Invalidate(); } private void pnl1_MouseWheel(object sender, MouseEventArgs e) { // Get mouse location mouse = e.location; // Get new scale (zoom) factor zoom = (float)(e.Delta > 0 ? zoom * 1.05 : zoom / 1.05); pnl1.Invalidate(); } private void pnl1_MouseDown(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left) return; pan = true; mouX = e.X; mouY = e.Y; oldX = imgX; oldY = imgY; } private void pnl1_MouseMove(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left || !pan) return; // Coordinates of panned image imgX = oldX + e.X - mouX; imgY = oldY + e.Y - mouY; pnl1.Invalidate(); } private void pnl1_MouseUp(object sender, MouseEventArgs e) { pan = false; } private void pnl1_Paint(object sender, PaintEventArgs e) { // Apply rotation angle @ center of bitmap e.Graphics.TranslateTransform(img.Width / 2, img.Height / 2); e.Graphics.RotateTransform(ang); e.Graphics.TranslateTransform(-img.Width / 2, -img.Height / 2); // Apply scaling factor - focused @ mouse location e.Graphics.TranslateTransform(mouse.X, mouse.Y, MatrixOrder.Append); e.Graphics.ScaleTransform(zoom, zoom, MatrixOrder.Append); e.Graphics.TranslateTransform(-mouse.X, -mouse.Y, MatrixOrder.Append); // Apply drag (pan) location e.Graphics.TranslateTransform(imgX, imgY, MatrixOrder.Append); // Draw "bmp" @ location e.Graphics.DrawImage(img, 0, 0); }
Mögliche Lösungen:
Um dieses Problem zu beheben und ein reibungsloses Zoomen von der Mausposition aus zu erreichen, beachten Sie die folgenden Vorschläge und Tricks:
1. Teilen und erobern: Zerlegen Sie die verschiedenen Grafikeffekte und Transformationen in separate, spezialisierte Methoden, die bestimmte Aufgaben ausführen. Entwerfen Sie diese Methoden dann so, dass sie bei Bedarf nahtlos zusammenarbeiten.
2. Halten Sie es einfach: Bei der Anwendung mehrerer Grafiktransformationen kann die Reihenfolge, in der Matrizen gestapelt werden, zu Verwirrung und unerwarteten Ergebnissen führen. Es ist einfacher, bestimmte Transformationen (hauptsächlich Übersetzung und Skalierung) im Voraus zu berechnen und GDI das Rendern vorverarbeiteter Objekte und Formen übernehmen zu lassen.
3. Verwenden Sie die richtigen Tools: Ein Panel als „Leinwand“ wird für Szenarien wie dieses nicht empfohlen. Es fehlt die doppelte Pufferung, obwohl sie aktiviert werden kann. Eine PictureBox (oder ein Nicht-System-Flat-Label) bietet jedoch standardmäßig doppelte Pufferung und ist zum Zeichnen konzipiert, anstatt untergeordnete Steuerelemente zu enthalten.
4. Implementieren Sie Zoommodi: Anstatt blind von der Mausposition aus zu skalieren, stellen Sie verschiedene Methoden zur Steuerung des Zoomverhaltens bereit. Implementieren Sie Zoommodi wie ImageLocation, CenterCanvas, CenterMouse und MouseOffset, um Flexibilität zu bieten und verschiedenen Anwendungsfällen gerecht zu werden.
Indem Sie diese Richtlinien befolgen und maßgeschneiderte Zoommodi implementieren, können Sie gleichzeitig ein reibungsloses und effektives Zoomen von der Mausposition aus erreichen Beibehaltung der gewünschten Bildposition und des Skalierungsfaktors.
Das obige ist der detaillierte Inhalt vonWarum springt mein Bild beim Zoomen mit dem Mauszeiger mithilfe von C#-Transformationen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!