使用变换从鼠标光标缩放图像
在这种情况下,尝试从鼠标光标缩放(缩放)图像鼠标位置使用 Paint 事件中的转换将位图原点转换为鼠标位置,然后缩放图像并平移其原点
问题:
平台:
相关代码块:
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中文网其他相关文章!