首页 >后端开发 >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?

使用变换从鼠标光标缩放图像

在这种情况下,尝试从鼠标光标缩放(缩放)图像鼠标位置使用 Paint 事件中的转换将位图原点转换为鼠标位置,然后缩放图像并平移其原点

问题:

  • 平移鼠标位置时,图像从重新定位的原点跳转且无法缩放。
  • 旋转,缩放和平移功能正确,无需转换为鼠标位置。

平台:

  • .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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn