【问题标题】:Zoom an image in a picture box在图片框中缩放图像
【发布时间】:2015-12-30 23:20:53
【问题描述】:

我知道已经有很多关于这个话题的讨论,但我仍然找不到答案。希望有人有想法。

我在PictureBoxSizeMode Normal,DockStyle Fill)中加载位图并使用Paint 事件来绘制图像。

要缩放,我使用MouseWheel 事件并增加/减少缩放系数(如 _zoomFac += 1)。目标是缩放鼠标位置。所以在MouseWheel 事件中,我还保存了鼠标位置(_imageZoomLocation)。这是我的代码(只有很少的测试实现):

public partial class Form1 : Form
{
  private Image _image;
  private float _zoomFac;
  private PointF _imageZoomLocation;

  public Form1()
  {
    InitializeComponent();
    _image = null;
    _zoomFac = 1F;
    _imageZoomLocation = PointF.Empty;
    pictureBox.MouseWheel += new MouseEventHandler(OnMouseWheel);
  }

  private void pb_Paint(object sender, PaintEventArgs e)
  {
    if (_image == null)
      return;
    e.Graphics.TranslateTransform(-_imageZoomLocation.X +    _imageZoomLocation.X / _zoomFac, -_imageZoomLocation.Y +   _imageZoomLocation.Y / _zoomFac);
    e.Graphics.ScaleTransform(_zoomFac, _zoomFac, MatrixOrder.Append);
    e.Graphics.DrawImage(_image, new Point(0,0));
  }

  private void fileToolStripMenuItem_Click(object sender, EventArgs e)
  {
    ... Code for loading image
  }

  private void OnMouseWheel(object sender, MouseEventArgs e)
  {
    if (_image == null)
      return;

    _imageZoomLocation = e.Location;

    if (e.Delta > 0)
      _zoomFac += 1F;
    else
      if (_zoomFac - 1F < 1F)
        _zoomFac = 1F;
      else
        _zoomFac -= 1F;

    Refresh();
  }

  private void pb_MouseEnter(object sender, EventArgs e)
  {
    pictureBox.Focus();
  }
}

只要_imageZoomLocation 没有改变就可以很好地工作,这意味着鼠标没有移动我可以完美地放大和缩小(当缩放因子为 1 时我可以改变鼠标位置并且一切仍然有效)。但是,当我在缩放状态下将鼠标移动到不同的位置(例如缩放因子为 2)并滚动时,图像会跳转到与鼠标不同的位置一次,并且在此“跳转”之后一切正常。

谁能解释这种行为?

【问题讨论】:

  • 这听起来很像winforms技术。
  • 是的,你是对的。我忘了提。
  • 您将需要开始熟悉 Visual Studio 令人敬畏的调试器,或者向我们提供 所有 相关代码,这可能是一项无望的努力,很可能您最终会熟悉 Visual Studio 的出色调试器无论如何
  • 别担心我使用 vs,因为它存在并且知道如何使用调试器:-)。但我会按照你的建议更新代码示例。

标签: c# winforms graphics paint picturebox


【解决方案1】:

在下一行中,您将 imageZoomLocation.X 和 .Y 除以缩放因子的一半时间。相反,也许您需要一个单独的变量来保留以前的鼠标位置。

e.Graphics.TranslateTransform(-_imageZoomLocation.X + _imageZoomLocation.X / _zoomFac, _
                              -_imageZoomLocation.Y + _imageZoomLocation.Y / _zoomFac);

【讨论】:

  • 感谢您的回答!只是我看到了我的错误。当然,如果我在缩放图像中移动鼠标,鼠标坐标将被缩放因子放大:)。我认为您的建议是朝着正确方向迈出的一步!
猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多