[英]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.