winform pictureBox中对图片进行放缩 绘制ROI
时间: 2023-08-11 12:03:14 浏览: 170
好的,针对你的问题,下面是一个示例代码,演示如何在 WinForm 的 PictureBox 控件中对图片进行放缩,并绘制 ROI(Region Of Interest):
```csharp
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
namespace MyImageApp
{
public partial class Form1 : Form
{
private Bitmap originalImage;
private Bitmap zoomedImage;
private Graphics g;
private Rectangle roiRect;
public Form1()
{
InitializeComponent();
originalImage = new Bitmap("image.jpg"); // 加载原始图片
pictureBox1.Image = originalImage; // 显示原始图片
g = pictureBox1.CreateGraphics(); // 创建画布
roiRect = new Rectangle(0, 0, 50, 50); // 设置 ROI 的初始大小为 50x50
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
// 获取当前滑块的值
int value = trackBar1.Value;
// 计算缩放后的图片大小
int newWidth = (int)(originalImage.Width * (value / 10.0));
int newHeight = (int)(originalImage.Height * (value / 10.0));
// 创建缩放后的图片
zoomedImage = new Bitmap(originalImage, newWidth, newHeight);
// 显示缩放后的图片
pictureBox1.Image = zoomedImage;
// 更新 ROI 的大小
roiRect.Width = (int)(50 * (value / 10.0));
roiRect.Height = (int)(50 * (value / 10.0));
// 绘制 ROI
g.Clear(Color.Transparent); // 清空画布
g.DrawRectangle(new Pen(Color.Red), roiRect);
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
// 如果鼠标左键被按下
if (e.Button == MouseButtons.Left)
{
// 更新 ROI 的位置
roiRect.Location = new Point(e.X, e.Y);
// 绘制 ROI
g.Clear(Color.Transparent); // 清空画布
g.DrawRectangle(new Pen(Color.Red), roiRect);
}
}
}
}
```
在这个示例中,我们使用了一个 TrackBar 控件来控制图片的放缩比例。在 TrackBar 的 ValueChanged 事件中,我们计算出缩放后的图片大小,并创建了一个新的 Bitmap 对象来存储缩放后的图片。然后,我们将 PictureBox 的 Image 属性设置为缩放后的图片,并更新 ROI 的大小。
在 PictureBox 的 MouseMove 事件中,我们检测鼠标左键是否被按下,如果是,则更新 ROI 的位置,并重新绘制 ROI。
需要注意的是,我们在绘制 ROI 时,使用了一个透明的画笔,这样可以避免绘制出来的 ROI 遮挡原始图片。同时,在更新 ROI 的位置时,我们只更新了 ROI 的 Location 属性,而没有更新它的 Size 属性,这是因为我们希望 ROI 的大小能够随着图片的放缩比例而自动更新。
阅读全文