Maison >développement back-end >C++ >Comment zoomer et effectuer un panoramique correctement sur une image à partir de l'emplacement de la souris en C# ?

Comment zoomer et effectuer un panoramique correctement sur une image à partir de l'emplacement de la souris en C# ?

DDD
DDDoriginal
2024-12-30 20:18:12586parcourir

How to Correctly Zoom and Pan an Image from the Mouse Location in C#?

Zoom et traduction d'une image à partir de l'emplacement de la souris

Description du problème

Lorsque vous essayez de zoomer et de redimensionner une image à partir de l'emplacement de la souris, l'image saute et ne parvient pas à évoluer à partir de l'origine déplacée. La rotation, la mise à l'échelle et le panoramique fonctionnent correctement sans se traduire par l'emplacement de la souris.

Mise en œuvre

Pour réaliser un zoom et une traduction d'une image à partir de l'emplacement de la souris, nous utilisons les stratégies suivantes :

  • TranslateTransform : Traduit le bitmap vers la souris position.
  • ScaleTransform : redimensionne l'image en fonction du facteur de zoom.
  • TranslateTransform : traduit l'image à sa position d'origine.
  • TranslateTransform : Traduit l'image en fonction du panoramique position.

Code

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);
}

Suggestions

  • Divisez et conquérez les transformations en méthodes spécialisées.
  • Utilisez une PictureBox personnalisée. avec double tampon (par exemple, PictureBoxEx).
  • Utilisez Matrix.RotateAt et Matrix.Multiply pour des transformations efficaces.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn