簡體   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