変換を使用したマウス カーソルからの画像のズーム
このシナリオでは、マウス カーソルから画像をズーム (スケール) しようとします。ペイント イベントの変換を使用してマウスの位置を変更し、ビットマップの原点をマウスの位置に変換し、画像をスケールしてその原点を変換します。
問題:
プラットフォーム:
関連するコード ブロック:
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 サイトの他の関連記事を参照してください。