在C#中 从一个picturebox中 按住鼠标左键不放 画一块区域后,另外一个picturebox(在一个winform 窗体上有两个picturebox )上马上把对应的截取图像显示出来

本文介绍了一个简单的图片选择器实现方法,通过鼠标拖动在PictureBox上绘制虚线矩形选择区域,并将选中部分复制到另一个PictureBox中。文章详细展示了如何监听MouseDown、MouseMove和MouseUp事件来完成这一过程。

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

        private int _x, _y;
        Image _img
= null;
       
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            _img
= pictureBox1.Image.Clone() as Image;
            _x
= e.X;
            _y
= e.Y;

        }

       
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
           
int sx = _x < e.X ? _x : e.X;
           
int sy = _y < e.Y ? _y : e.Y;
           
int w = Math.Abs(_x - e.X);
           
int h = Math.Abs(_y - e.Y);
            Graphics g
= Graphics.FromHwnd(pictureBox2.Handle);
            g.Clear(pictureBox2.BackColor);
            g.DrawImage(pictureBox1.Image,
new Rectangle(0, 0, w, h), sx, sy, w, h, GraphicsUnit.Pixel);
        }

       
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
           
if (e.Button == MouseButtons.Left)
            {
                Pen p
= new Pen(Color.Red, 1);
                p.DashStyle
= System.Drawing.Drawing2D.DashStyle.Dash;
                Graphics g
= Graphics.FromHwnd(pictureBox1.Handle);
               
int sx = _x < e.X ? _x : e.X;
               
int sy = _y < e.Y ? _y : e.Y;
               
int w = Math.Abs(_x - e.X);
               
int h = Math.Abs(_y - e.Y);
                pictureBox1.Image
= _img;
                g.DrawRectangle(p, sx, sy, w, h);
            }
        }


不过这样效果不是很好,最好是这样,你有一个image保存最原始的图片, 画虚线框在这个image的副本上画,然后赋值给pictuebox1,取图片拷贝的时候也从原始的image上取
C# 中,要在 PictureBox 控件上绘制一个田字格,你需要使用 Graphics 类提供的绘图方法。首先,你需要设置PictureBox的图片模式为GraphicsMode.AntiAlias,以便图形平滑显示,并确保图片大小适中。然后,你可以编写一个方法来创建并绘制田字格的线条。下面是一个简单的示例: ```csharp // 设置PictureBox pictureBox.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox.ImageAttributes = new ImageAttributes { InterpolationMode = ColorInterpolationMode.HighQualityBicubic }; pictureBox.BackgroundImage = new Bitmap(pictureBox.Width, pictureBox.Height); // 创建一个新的Bitmap // 定义田字格线的颜色和宽度 private const int LineColor = Color.Black; private const int LineWidth = 2; // 绘制田字格方法 public void DrawTianZiGe(Graphics g) { int cellSize = pictureBox.Width / 3; // 假设每个小格是大格的三分之一 for (int i = 0; i <= pictureBox.Width / cellSize; i += cellSize) { g.DrawLine(LineColor, i, 0, i, pictureBox.Height); g.DrawLine(LineColor, 0, i, pictureBox.Width, i); } for (int j = cellSize; j < pictureBox.Height; j += cellSize * 2) { g.DrawLine(LineColor, 0, j, pictureBox.Width, j); } } // 调用绘制方法 pictureBox.Paint += (sender, e) => DrawTianZiGe(e.Graphics); // 清除默认的背景颜色 pictureBox.BackColor = Color.Transparent; ``` 在这个例子中,我们假设了田字格是由三个等大的行分割的大格组成,每行有两道竖线和一道横线。每次Paint事件发生时,都会自动调用 `DrawTianZiGe` 方法绘制田字格。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值