缩放图片框中的图像

本文关键字:图像 缩放 | 更新日期: 2023-09-27 18:15:48

我知道这个话题已经有很多讨论了,但是我仍然找不到答案。希望有人能出主意。

我在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没有改变,这就很好地工作了,这意味着鼠标没有移动,我可以完美地放大和缩小(当缩放因子为1时,我可以改变鼠标位置,一切仍然有效)。然而,当我将鼠标移动到缩放状态下的不同位置(例如缩放因子为2)并滚动时,图像会跳转到与鼠标不同的位置,在此"跳转"之后,一切都恢复正常。

有人能解释这种行为吗?

缩放图片框中的图像

在下一行中,您将划分imageZoomLocation。X和y的缩放系数只有一半的时间。相反,您可能需要一个单独的变量来保留以前的鼠标位置。

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