ホームページ >バックエンド開発 >C++ >C# でマウスの位置から画像を正しくズームおよびパンする方法?

C# でマウスの位置から画像を正しくズームおよびパンする方法?

DDD
DDDオリジナル
2024-12-30 20:18:12586ブラウズ

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

マウスの位置から画像をズームおよび移動する

問題の説明

マウスの位置から画像をズームおよび拡大縮小しようとすると、画像ジャンプして、再配置された原点からのスケールに失敗します。回転、スケール、パンは、マウスの位置に変換しなくても正しく機能します。

実装

マウスの位置から画像をズームおよび変換するには、次の戦略を採用します。

  • TranslateTransform: ビットマップをマウスに変換します。
  • ScaleTransform: ズーム倍率に従って画像を拡大縮小します。
  • TranslateTransform: 画像を元の位置に戻します。
  • >
  • TranslateTransform: パンに基づいて画像を変換します

コード

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

提案

  • 変換を特殊なメソッドに分割して征服します。
  • カスタム PictureBox を使用しますダブルバッファリングを使用する (例: PictureBoxEx).
  • 効率的な変換のために Matrix.RotateAt と Matrix.Multiply を利用します。

以上がC# でマウスの位置から画像を正しくズームおよびパンする方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。