CopyFromScreen方法的使用案例

写在前面:有没有想过屏幕捕捉是很简单的事情?至少,在.Net上面,是很简单的事情,还有一个方法专门提供了这个功能,它就是CopyFromScreen方法,是Graphics的实例的一个方法,可以将当前屏幕上面的指定区域捕捉下来。如果对这个功能做进一步的扩展,很容易就可以做出一个像红蜻蜓一样的屏幕捕捉工具,当然,专业水平肯定还不及人家的产品的。

效果图
效果图中显示有多个控件,其中重要的是名为“捕捉屏幕”的按钮,三组数据的输入框和一个显示图形的盒子(PictureBox),实现的原理是,先指定要捕捉的位置和捕捉的大小,新建一个这样大小的空的图像(Bitmap),然后,从Bitmap中提取出Graphics的实例,使用这个实例,调用CopyFromScreen方法获取抓取屏幕中的图形区域,这样,Bitmap中就有图形了。再将Bitmap放入PictureBox显示就可以了。注意,输入的X轴,Y轴,大小的数据都必须是数字,下面的程序中,并没有处理错误输入的情况,输入后,点击“捕捉屏幕”就能够显示图片了。
 

源代码
下面代码的关键是Graphics.FromImage和CopyFromScreen方法,前者表示从指定的 System.Drawing.Image 创建新的 System.Drawing.Graphics,后者表示,使用Graphics对象的实例调用捕捉屏幕功能,也就是所谓执行颜色数据(对应于由像素组成的矩形)从屏幕到 System.Drawing.Graphics 的绘图图面的位块传输。最后设置pictureBox1就行了。
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {          
            //通过输入的数据获取需要捕捉的区域的大小和位置
            int sizeWidth = Convert.ToInt32(textBoxSize.Text);
            int sizeHeight = Convert.ToInt32(textBoxSize.Text);
            int sourceX = Convert.ToInt32(textBoxX.Text);
            int sourceY = Convert.ToInt32(textBoxY.Text);

            //设置图像的大小
            Bitmap _bitMap = new Bitmap(sizeWidth, sizeHeight);
            Graphics g = Graphics.FromImage(_bitMap);
            //从指定的区域中复制图形
            g.CopyFromScreen(sourceX, sourceY, 0, 0, new Size(sizeWidth, sizeWidth));
            //把图形放在PictureBox中显示
            pictureBox1.Image = _bitMap;
            g.Dispose();
            //不能使用Dispose,不然图片就没有了,同时也会引起异常
            //_bitMap.Dispose();
        }
   }

本站中使用屏幕捕捉功能的相关文章

.Net(C#)自定义WinForm控件之屏幕捕捉(Teboscreen)

http://www.myfirm.cn/news/DotNetUserInterface/20080220010644407.html

以下是使用 Gdiplus::Graphics 中的 CopyFromScreen 函数进行屏幕截图的示例代码: ```cpp #include <windows.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib") using namespace Gdiplus; int main() { // 初始化 GDI+ GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 获取屏幕大小 int screenWidth = GetSystemMetrics(SM_CXSCREEN); int screenHeight = GetSystemMetrics(SM_CYSCREEN); // 创建位图对象 Bitmap bitmap(screenWidth, screenHeight, PixelFormat32bppARGB); // 创建图形对象 Graphics graphics(&bitmap); // 从屏幕复制图像到位图 graphics.CopyFromScreen(0, 0, 0, 0, Size(screenWidth, screenHeight)); // 保存位图到文件 CLSID clsid; GetEncoderClsid(L"image/jpeg", &clsid); // 获取 JPEG 编码器的 CLSID bitmap.Save(L"screen.jpg", &clsid, NULL); // 释放 GDI+ GdiplusShutdown(gdiplusToken); return 0; } // 获取指定 MIME 类型的图像编码器的 CLSID int GetEncoderClsid(const WCHAR* mimeType, CLSID* pClsid) { UINT num = 0, size = 0; GetImageEncodersSize(&num, &size); if (size == 0) return -1; // 没有找到图像编码器 ImageCodecInfo* pImageCodecInfo = (ImageCodecInfo*)malloc(size); GetImageEncoders(num, size, pImageCodecInfo); for (UINT i = 0; i < num; i++) { if (wcscmp(pImageCodecInfo[i].MimeType, mimeType) == 0) { *pClsid = pImageCodecInfo[i].Clsid; free(pImageCodecInfo); return i; } } free(pImageCodecInfo); return -1; // 没有找到指定 MIME 类型的图像编码器 } ``` 注意: 1. 为了使用 GDI+,需要在代码中包含 gdiplus.h 头文件,并且链接 gdiplus.lib 库文件。 2. 上面的代码使用了 GetEncoderClsid 函数来获取 JPEG 编码器的 CLSID。如果你需要保存成其他格式的图片,可以自行修改该函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值