C# 在图片框中缩放图像

C# 在图片框中缩放图像,c#,winforms,graphics,paint,picturebox,C#,Winforms,Graphics,Paint,Picturebox,我知道这个话题已经有很多讨论了,但我还是找不到答案。希望有人有想法 我在PictureBox(SizeModeNormal,DockStyleFill)中加载位图,并使用Paint事件绘制图像 要缩放,我使用mouseweel事件并增加/减少缩放因子(如_zoomFac+=1)。目标是在鼠标位置进行缩放。因此,在鼠标滚轮事件中,我还保存了鼠标位置(\u imageZoomLocation)。这是我的代码(只有很少的测试实现): 公共部分类表单1:表单 { 私人形象"形象;; 私人浮标; 私有点f

我知道这个话题已经有很多讨论了,但我还是找不到答案。希望有人有想法

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

要缩放,我使用
mouseweel
事件并增加/减少缩放因子(如_zoomFac+=1)。目标是在鼠标位置进行缩放。因此,在
鼠标滚轮
事件中,我还保存了鼠标位置(
\u imageZoomLocation
)。这是我的代码(只有很少的测试实现):

公共部分类表单1:表单
{
私人形象"形象;;
私人浮标;
私有点f_imageZoomLocation;
公共表格1()
{
初始化组件();
_image=null;
_zoomFac=1F;
_imageZoomLocation=PointF.Empty;
pictureBox.MouseWheel+=新的MouseEventHandler(OnMouseWheel);
}
私有void pb_Paint(对象发送器,PaintEventArgs e)
{
如果(_image==null)
返回;
e、 Graphics.TranslateTransform(-u-imageZoomLocation.X+\u-imageZoomLocation.X/\u-zoomFac,--u-imageZoomLocation.Y+\u-imageZoomLocation.Y/\u-zoomFac);
e、 ScaleTransform(_zoomFac,_zoomFac,MatrixOrder.Append);
e、 绘图图像(_图像,新点(0,0));
}
私有无效文件工具条带菜单项单击(对象发送方,事件参数e)
{
…用于加载图像的代码
}
MouseWheel上的私有void(对象发送器,MouseEventArgs e)
{
如果(_image==null)
返回;
_imageZoomLocation=e.位置;
如果(e.Delta>0)
_zoomFac+=1F;
其他的
如果(_zoomFac-1F<1F)
_zoomFac=1F;
其他的
_zoomFac-=1F;
刷新();
}
私有void pb_MouseEnter(对象发送方,事件参数e)
{
pictureBox.Focus();
}
}
只要
\u imageZoomLocation
没有改变,这就可以很好地工作,这意味着鼠标没有移动,我可以完美地进行放大和缩小(当缩放因子为1时,我可以改变鼠标位置,一切都可以正常工作)。但是,当我在缩放状态下将鼠标移动到不同的位置(例如,缩放因子为2)并滚动时,图像会跳转一次到与鼠标不同的位置,在“跳转”之后,一切都会恢复正常


有人能解释这种行为吗?

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

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

这听起来很像是
winforms
技术。是的,你是对的。我忘了提到。请。您需要开始熟悉Visual Studio的很棒的调试器,或者向我们提供所有相关代码,这可能是一个无望的尝试,不管怎样,你很可能最终会熟悉VisualStudio很棒的调试器。不用担心,我使用vs,因为它存在并且知道如何使用调试器:-)。但是我会按照你的建议更新代码示例。谢谢你的回答!只是我看到了我的错误。当然,如果我在缩放图像中移动鼠标,鼠标坐标将被缩放因子放大:)。我认为你的建议是朝着正确的方向迈出的一步!
e.Graphics.TranslateTransform(-_imageZoomLocation.X + _imageZoomLocation.X / _zoomFac, _
                              -_imageZoomLocation.Y + _imageZoomLocation.Y / _zoomFac);