实例说明
在工作中,有时需要抓取图片。如果通过Windows系统自带的抓图工具,只能抓取当前窗体的图片,而不能抓取局部图片。一些聊天工具提供了抓图工具,可以通过鼠标选取要抓取的范围,使用起来非常方便,本实例同样实现了与类似的功能,实例运行结果如图所示。
技术要点
截图的思路是首先抓取整个屏幕图片,然后在图片上按住鼠标左键,拖动鼠标选择区域,当双击鼠标左键时,将选择的区域保存下来。在绘制鼠标拖出的区域时用到了Graphics类的DrawRectangle方法,双击鼠标将选择的区域保存在系统剪贴板中,这一功能是通过Clipboard类实现的,下面进行详细介绍。
(1)绘制选择区域
当第一次按下鼠标左键时,记录鼠标的坐标。然后开始拖动鼠标设置截图区域,只要鼠标移动就会触发窗体的MouseMove事件,在该事件中会时刻记录鼠标当前的坐标,然后计算当前坐标与第一次按下鼠标左键时坐标的差值,然后通过Graphics类的DrawRectangle方法绘制矩形,该方法绘制由坐标对、宽度和高度指定的矩形,语法格式如下:
public void DrawRectangle(Pen pen,int x,int y,int width,int height)
pen:确定矩形的颜色、宽度和样式。
x:要绘制的矩形的左上角的x坐标。
y:要绘制的矩形的左上角的y坐标。
width:要绘制的矩形的宽度。
height:要绘制的矩形的高度。
例如,在本实例中通过此方法绘制截图区域,代码如下:
private void MoveRect(Image image, Rectangle Rect)
{
Graphics Painter = Graphics.FromImage(image);
Painter.DrawRectangle(pen, Rect.X, Rect.Y, Rect.Width, Rect.Height); //绘制截图区域
DrawRects(Painter);
MainPainter.DrawImage(image, 0, 0); //绘制图片
image.Dispose();
}
(2)保存选择区域
当通过鼠标设置截图区域后,双击鼠标左键将截图部分存入系统剪贴板中,这一功能是通过Clipboard类的SetImage方法实现的,该方法将Bitmap数据存储在剪贴板上,语法格式如下:
public static void SetImage(BitmapSource image)
image:一个BitmapSource对象,其中包含要存储在剪贴板上的图像数据。
例如,在本实例中通过此方法将截图保存在系统剪贴板中,代码如下:
private void Form2_DoubleClick(object sender, EventArgs 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); //实例化Image
Graphics g = Graphics.FromImage(memory); //实例化Graphics
g.CopyFromScreen(Rect.X+1, Rect.Y+1,0, 0, Rect.Size); //获取选择的区域
Clipboard.SetImage(memory); //存入剪贴板
this.Close();
}
}
未完。。。。