PictureBox 放大、缩小、移动图片:在指定区域利用PictureBox 的Zoom模式缩放

本文详细描述了如何在C#中使用PictureBox和Panel实现指定区域内图片的动态放大、缩小和移动功能,包括设置PictureBox的初始大小、SizeMode,处理鼠标事件以及计算缩放和移动的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 前记:

 搞了很久,就是希望实现在指定范围内根据鼠标位置放大、缩小、移动图片,开始只有一个PictureBox搞了好久各种莫名其妙的bug(指现象),这么困难的原因是pictureBox自身的大小和图片路径的图片实际大小很混乱,后来添加了Panel指定范围,同时利用PictureBox 的Zoom模式实现缩放。尤其是你希望图片开始时是适应指定范围的全图,然后根据鼠标位置实现放大、缩小、移动。

大致步骤:

1、弄一个面板来指定范围(先初始化Panel panel):

Form1.Controls.Add(panel);位置new Point(x,y), 尺寸new Size(w, h)。

2、面板控件里添加PictureBox(先初始化),设置位置尺寸和SizeMode:

panel.Controls.Add(pictureBox);new Point(0,0), panel.SizeZoom。

3、获取图片路径,加载图片LoadImage(imagePath),注册鼠标事件pictureBox.MouseWheel、...Down、...Up、...Move。

4、LoadImage用PictureBox显示图片,获取Zoom模式下显示图片的尺寸,更改pictureBox尺寸和位置(Zoom模式下显示图片的尺寸和位置)。(有代码)

5、鼠标事件:根据鼠标位置和滚筒实现放大、缩小、移动图片。

移动:(记得获取控件焦点)

Down:记录鼠标按下时位置,isMove=true;

Up:isMove=flase;

Move:if(isMove)计算XY方向移动量,更新pictureBox位置

缩放:(鼠标在pictureBox上)(有代码)

Wheel在鼠标位置缩放)让鼠标在控件范围内滚动时不会触发页面滚动条也跟随滚动,获取缩放因子,获取pictureBox缩放后的大小和位置

关键代码:

 获取Zoom模式下显示图片的尺寸和位置:

		private void LoadImage(string imagepath)
		{   // 通过 PictureBox 显示图片
            //pictureBox.Image = LoadNetworkPic(imagepath);你自己的的图片加载方法
		    Size imageSize = pictureBox.Image.Size;
		    Rectangle clientRectangle = pictureBox.ClientRectangle;
		    float imageAspect = imageSize.Width / (float)imageSize.Height;
		    float controlAspect = clientRectangle.Width / (float)clientRectangle.Height;

		    if (imageAspect < controlAspect)
		    {
		        imageHeight = clientRectangle.Height;
		        imageWidth = (int)(imageHeight * imageAspect);
		        top = 0;
		        left = (clientRectangle.Width - imageWidth) / 2;
		    }
		    else
		    {
		        imageWidth = clientRectangle.Width;
		        imageHeight = (int)(imageWidth / imageAspect);
		        left = 0;
		        top = (clientRectangle.Height - imageHeight) / 2;
		    }
			pictureBox.Size=new Size(imageWidth,imageHeight);
			pictureBox.Location=new Point(left,top);
			
				//注册鼠标事件
				pictureBox.MouseWheel += new MouseEventHandler(PictureBox_MouseWheel);
				pictureBox.MouseMove += new MouseEventHandler(PictureBox_MouseMove);
				pictureBox.MouseDown += new MouseEventHandler(PictureBox_MouseDown);
				pictureBox.MouseUp += new MouseEventHandler(PictureBox_MouseUp);
		}

 Wheel事件

 比较白痴的画图举例找规律(欢迎评论区代码改进)

		private void PictureBox_MouseWheel(object sender, MouseEventArgs e)
		{
			if (pictureBox.ClientRectangle.Contains(e.Location))
			{
				((HandledMouseEventArgs)e).Handled = true;
				pictureBox.Focus();
				float zoomChange = e.Delta> 0? 2f : 0.5f;
				float zoomFactor = 1.0f;
	            zoomFactor *= zoomChange;
	            // 计算缩放后图片的大小 
	            int newWidth = (int)(pictureBox.Width * zoomFactor);
	            int newHeight = (int)(pictureBox.Height * zoomFactor);	
				if(e.Delta> 0){
		        newX = (int)(pictureBox.Left - e.X);
		        newY = (int)(pictureBox.Top - e.Y);}
				else{
		        newX = (int)(pictureBox.Left + e.X / 2);
		        newY = (int)(pictureBox.Top + e.Y / 2);}
				pictureBox.Size = new Size(newWidth, newHeight);
				pictureBox.Location = new Point(newX, newY);
			}
		}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值