Mengezum Imej daripada Kursor Tetikus Menggunakan Transformasi
Dalam senario ini, percubaan dibuat untuk mengezum (skala) Imej daripada lokasi tetikus menggunakan transformasi dalam acara Paint untuk menterjemahkan asal bitmap ke lokasi tetikus dan kemudian menskalakan Imej dan menterjemahkan asalnya kembali.
Isu:
Platform:
Kod Berkaitan Sekatan:
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); }
Penyelesaian Berkemungkinan:
Untuk menangani isu ini dan mencapai zum lancar dari lokasi tetikus, pertimbangkan cadangan dan helah berikut:
1. Bahagi dan Takluk: Pecahkan kesan dan transformasi grafik yang berbeza kepada kaedah khusus yang berasingan yang melaksanakan tugas tertentu. Kemudian, reka kaedah ini untuk berfungsi bersama dengan lancar apabila diperlukan.
2. Pastikan Ia Mudah: Apabila menggunakan berbilang transformasi grafik, susunan Matriks disusun boleh menyebabkan kekeliruan dan hasil yang tidak dijangka. Adalah lebih mudah untuk mengira transformasi tertentu (terjemahan dan penskalaan, terutamanya) terlebih dahulu dan biarkan GDI mengendalikan pemaparan objek dan bentuk pra-diproses.
3. Gunakan Alat yang Betul: Panel sebagai "kanvas" tidak disyorkan untuk senario seperti ini. Ia tidak mempunyai penimbalan berganda, walaupun ia boleh didayakan. Walau bagaimanapun, PictureBox (atau Label rata bukan Sistem) menawarkan penimbalan dua kali di luar kotak dan direka bentuk untuk melukis dan bukannya mengandungi Kawalan kanak-kanak.
4. Laksanakan Mod Zum: Daripada menskala secara membuta tuli dari lokasi tetikus, sediakan kaedah berbeza untuk mengawal gelagat zum. Laksanakan mod zum seperti ImageLocation, CenterCanvas, CenterMouse dan MouseOffset untuk menawarkan fleksibiliti dan memenuhi pelbagai kes penggunaan.
Dengan mengikuti garis panduan ini dan melaksanakan mod zum yang disesuaikan, anda boleh mencapai zum yang lancar dan berkesan dari lokasi tetikus sambil mengekalkan kedudukan imej dan faktor skala yang diingini.
Atas ialah kandungan terperinci Mengapa Imej Saya Melompat Apabila Mengezum dari Kursor Tetikus Menggunakan Transformasi C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!