Heim > Backend-Entwicklung > C++ > Warum springt mein Bild beim Zoomen mit dem Mauszeiger mithilfe von C#-Transformationen?

Warum springt mein Bild beim Zoomen mit dem Mauszeiger mithilfe von C#-Transformationen?

Susan Sarandon
Freigeben: 2024-12-25 06:47:43
Original
326 Leute haben es durchsucht

Why Does My Image Jump When Zooming from the Mouse Cursor Using C# Transformations?

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:

  • Das Bild springt und kann beim Verschieben der Mausposition nicht vom verschobenen Ursprung aus skaliert werden.
  • Drehen, Skalieren und Schwenken funktionieren korrekt, ohne dass sie auf die Maus übertragen werden Standort.

Plattform:

  • .Net 4.7.2
  • Visual Studio in Windows 10 1909 (18363.778)

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);
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage