ホームページ >バックエンド開発 >C++ >C# 変換を使用してマウス カーソルからズームすると画像がジャンプするのはなぜですか?

C# 変換を使用してマウス カーソルからズームすると画像がジャンプするのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-25 06:47:43331ブラウズ

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

変換を使用したマウス カーソルからの画像のズーム

このシナリオでは、マウス カーソルから画像をズーム (スケール) しようとします。ペイント イベントの変換を使用してマウスの位置を変更し、ビットマップの原点をマウスの位置に変換し、画像をスケールしてその原点を変換します。

問題:

  • マウスの位置を移動するときに画像がジャンプし、再配置された原点から拡大縮小できません。
  • 回転、マウスに変換せずに、スケールとパンが正しく機能するようになりました。場所。

プラットフォーム:

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

関連するコード ブロック:

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

考えられる解決策:

この問題に対処するにはマウスの位置からのスムーズなズームを実現するには、次の提案を考慮してください。トリック:

1.分割統治: さまざまなグラフィック効果と変換を、特定のタスクを実行する個別の特殊なメソッドに分割します。次に、必要なときにシームレスに連携できるようにこれらのメソッドを設計します。

2.シンプルに保つ: 複数のグラフィック変換を適用する場合、マトリックスを積み重ねる順序によって混乱が生じたり、予期しない結果が生じる可能性があります。特定の変換 (主に変換とスケーリング) を事前に計算し、前処理されたオブジェクトと形状のレンダリングを GDI に処理させる方が簡単です。

3.適切なツールを使用します: 「キャンバス」としてのパネルは、このようなシナリオには推奨されません。ダブルバッファリングはありませんが、有効にすることはできます。ただし、PictureBox (または非システム フラット ラベル) は、すぐに使用できるダブル バッファリングを提供し、子コントロールを含めるのではなく描画用に設計されています。

4.ズーム モードの実装: マウスの位置から盲目的にスケーリングするのではなく、ズーム動作を制御するさまざまな方法を提供します。 ImageLocation、CenterCanvas、CenterMouse、MouseOffset などのズーム モードを実装して、柔軟性を提供し、さまざまなユースケースに対応します。

これらのガイドラインに従い、カスタマイズされたズーム モードを実装することで、マウスの位置からスムーズかつ効果的なズームを実現できます。希望の画像位置とスケール係数を維持します。

以上がC# 変換を使用してマウス カーソルからズームすると画像がジャンプするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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