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

 前记:

 搞了很久,就是希望实现在指定范围内根据鼠标位置放大、缩小、移动图片,开始只有一个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);
			}
		}

  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
如果需要在C#中实现PictureBox放大缩小并可移动,可以使用以下步骤: 1. 在PictureBox控件上添加MouseDown、MouseMove和MouseUp事件处理程序。 2. 在MouseDown事件处理程序中记录鼠标按下时的位置,以便在MouseMove事件中计算鼠标移动的距离。 3. 在MouseMove事件处理程序中,计算鼠标移动的距离并将PictureBox控件的Location属性相应地调整。 4. 在MouseUp事件处理程序中重置记录鼠标按下时位置的变量。 5. 在放大缩小按钮的Click事件中,同样修改PictureBox的Size属性。 以下是一个示例代码: ``` private bool isDragging = false; private Point lastCursor; private Point lastForm; private double zoom = 1.0; private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { isDragging = true; lastCursor = Cursor.Position; lastForm = this.Location; } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (isDragging) { int xDiff = Cursor.Position.X - lastCursor.X; int yDiff = Cursor.Position.Y - lastCursor.Y; this.Location = new Point(lastForm.X + xDiff, lastForm.Y + yDiff); } } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { isDragging = false; } private void btnZoomIn_Click(object sender, EventArgs e) { zoom *= 1.1; pictureBox1.Size = new Size((int)(pictureBox1.Width * zoom), (int)(pictureBox1.Height * zoom)); } private void btnZoomOut_Click(object sender, EventArgs e) { zoom *= 0.9; pictureBox1.Size = new Size((int)(pictureBox1.Width * zoom), (int)(pictureBox1.Height * zoom)); } ``` 在这个示例中,我们使用了isDragging变量来记录鼠标是否按下,并在PictureBox的MouseDown、MouseMove和MouseUp事件处理程序中进行相应的操作。同时,我们使用了lastCursor和lastForm变量来记录鼠标按下时的位置和窗体的位置,以便在MouseMove事件中计算鼠标移动的距离。 在放大缩小按钮的Click事件中,我们同样修改了PictureBox的Size属性,并使用了一个zoom变量来记录缩放倍数。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值