欢迎大家提出意见,一起讨论!
转载请标明是引用于 http://blog.csdn.net/chenyujing1234
代码(VS2008):
http://www.rayfile.com/zh-cn/files/bad4b357-978a-11e1-8b2d-0015c55db73d/
在工作中需要抓取图片,那么就花一会儿时间用C#自己写一个吧
用到了Graphics类的DrawRectangle方法;
双击鼠标选择的区域保存在系统剪贴板中,这一功能通过Clipboard类的SetImage方法实现的。
(1)Graphics类的DrawRectangle方法
它用来绘制由坐标对、宽度和高度指定的矩形
// 绘制由坐标对、宽度和高度指定的矩形。 public void DrawRectangle(Pen pen, float x, float y, float width, float height);
(2) Glipboard类的SetImage方法
它将Bitmap数据存储在剪贴上
// 将 System.Windows.Forms.DataFormats.Bitmap 格式的 System.Drawing.Image 添加到剪贴板中。 public static void SetImage(Image image);
Form1窗体的后台代码中,首先获取整个屏幕的抓图,然后传递给第二个窗体
private void button1_Click(object sender, EventArgs e) { // 创建Image对象,用于存储整个屏幕的抓图 Image img = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height); // 创建graphics对象 Graphics g = Graphics.FromImage(img); // CopyFromScreen方法捕获整个屏幕图像 g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size); // 获取句柄 IntPtr dc = g.GetHdc(); // 释放 g.ReleaseHdc(dc); // 创建Frm_Browser对象 Frm_Browser frm2 = new Frm_Browser(); // 将img传递给ig frm2.ig = img; // 打开Frm_Browser窗体 frm2.Show(); }
Frm_Browser窗体的后台代码中,窗体的Load事件首先将Form1传递过来的屏幕图设定为窗体背景,
然后最大化。这样就可以在Frm_Browser窗体上使用鼠标选择截图的区域,以便保存
private void Frm_Browser_Load(object sender, EventArgs e) { // 将Form1传递过来的屏幕图设定为窗体背景 this.BackgroundImage = ig; // 最大化窗体 this.WindowState = FormWindowState.Maximized; // 创建Graphics对象 MainPainter = this.CreateGraphics(); pen = new Pen(Brushes.Tomato); // 判断鼠标是否按下 isDowned = false; // 获取捕获的屏幕图像 baseImage = this.BackgroundImage; // 创建Rectangle图像 Rect = new Rectangle(); // 是否出现边框 RectReady = false; change = false; Rectpoints = new Rectangle[8]; for (int i = 0; i < Rectpoints.Length; i ++ ) { Rectpoints[i].Size = new Size(4, 4); } }
当鼠标移动时,会触发MouseMove事件,在此事件中,判断鼠标左键是否按下,如果按下,则开始获取鼠标拖动后的选区
private void Frm_Browser_MouseMove(object sender, MouseEventArgs e) { if (RectReady == true) { if (Rect.Contains(e.X, e.Y)) { if (isDowned == true && change == false) { // 和上一次的位置比较获取偏移量 Rect.X = Rect.X + e.X - tmpx; Rect.Y = Rect.Y + e.Y - tmpy; // 记录现在的位置 tmpx = e.X; tmpy = e.Y; MoveRect((Image)baseImage.Clone(), Rect); } } } else { if (isDowned == true) { Image New = DrawScreen((Image)baseImage.Clone(), e.X, e.Y); MainPainter.DrawImage(New, 0, 0); New.Dispose(); } } }
private void Frm_Browser_MouseDoubleClick(object sender, MouseEventArgs e) { if (((MouseEventArgs)e).Button == MouseButtons.Left && Rect.Contains(((MouseEventArgs)e).X, ((MouseEventArgs)e).Y)) { Image memory = new Bitmap(Rect.Width - 1, Rect.Height - 1); Graphics g = Graphics.FromImage(memory); g.CopyFromScreen(Rect.X + 1, Rect.Y + 1, 0, 0, Rect.Size); Clipboard.SetImage(memory); this.Close(); } }