欢迎大家提出意见,一起讨论!
转载请标明是引用于 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();
}
}