繁体   English   中英

在图片框中缩放图像

[英]Zoom an image in a picture box

我知道已经有很多关于该主题的讨论,但是我仍然找不到答案。 希望有人有一个主意。

我在PictureBox加载位图( SizeMode 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 ,此方法_imageZoomLocation ,这意味着鼠标没有移动,我可以完美地放大和缩小(当缩放系数为1且一切正常时,我可以更改鼠标位置)。 但是,当我在缩放状态下将鼠标移到不同的位置(例如,缩放系数为2)并滚动时,图像一次跳到与鼠标不同的位置,并且在此“跳转”之后,一切恢复正常。

谁能解释这种行为?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM