公共函数
获取屏幕截图
private Bitmap GetScreenCapture()
{
Rectangle tScreenRect = new Rectangle(0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Bitmap tSrcBmp = new Bitmap(tScreenRect.Width, tScreenRect.Height); // 用于屏幕原始图片保存
Graphics gp = Graphics.FromImage(tSrcBmp);
gp.CopyFromScreen(0, 0, 0, 0, tScreenRect.Size);
gp.DrawImage(tSrcBmp, 0,0,tScreenRect,GraphicsUnit.Pixel);
return tSrcBmp;
}
1
2
3
4
5
6
7
8
9
图片灰度化
public static Bitmap ImgRgbToGray(Bitmap bitmap)
{
Bitmap b = new Bitmap(bitmap);
BitmapData bmData = b.LockBits( new Rectangle(0, 0, b.Width, b.Height),
ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);
int stride = bmData.Stride; // 扫描的宽度
unsafe
{
byte* p = (byte*)bmData.Scan0.ToPointer(); // 获取图像首地址
int nOffset = stride - b.Width * 3; // 实际宽度与系统宽度的距离
byte red, green, blue;
for (int y = 0; y < b.Height; ++y)
{
for (int x = 0; x < b.Width; ++x)
{
blue = p[0];
green = p[1];
red = p[2];

p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue); // 转换公式

p += 3; // 跳过3个字节处理下个像素点
}
p += nOffset; // 加上间隔
}
}
b.UnlockBits(bmData); // 解锁
return b;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
截图方法的具体实现
假定是在坐标为(55,88)的地方截取长宽为(520,233)的矩形,截图时整个背景灰化,截图区域显示原图

使用像素替换的方法
该方法代码最简单,核心函数是 GetPixel 、SetPixel ,但是速度不敢恭维!!!特别慢!!!!!!!!

private Bitmap PixelReplace()
{
Bitmap tSrcBtm = GetScreenCapture();
Bitmap tGrayBtm = ImgRgbToGray();
for (int i = 55; i < 55 + 520; i++)
{
for (int k = 88; k < 88 + 233; k++)
{
tGrayBtm.SetPixel(i,k, tSrcBtm.GetPixel(i,k));
}
}
return tGrayBtm;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
在原图上画图的方法
该方法比较快,但是每次都需要重新绘制,改变了底图

private Bitmap DrawOnPicture()
{
int tAbsWidth = 1;
Bitmap tSrcBtm = GetScreenCapture();
Bitmap tGrayBtm = ImgRgbToGray();
Rectangle tRectArea = new Rectangle(55, 88, 520, 233);
Rectangle tDrawArea = new Rectangle(55 + tAbsWidth, 88 + tAbsWidth, 520 - tAbsWidth, 233 - tAbsWidth);
Graphics gp = Graphics.FromImage(tGrayBtm);
gp.DrawRectangle(Pens.Red, tRectArea);
gp.DrawImage(tSrcBtm, tDrawArea, tRectArea, GraphicsUnit.Pixel);

return tGrayBtm;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
使用蒙板的方法
实际上也是在在图片上画图,只不过背景上直接画了一个灰色的rect铺满屏幕,而不是取的灰度图

public void CaptureScreen()
{
// 获取屏幕
Bitmap btp = GetScreenCapture();
Image BackScreen = new Bitmap(btp);

// 在 BackScreen 上绘制蒙板
Graphics g = Graphics.FromImage(BackScreen);
g.FillRectangle(new SolidBrush(Color.FromArgb(100, 0, 0, 0)), 0, 0, BackScreen.Width, BackScreen.Height);
this.BackgroundImage = BackScreen;

// 最大化
this.WindowState = FormWindowState.Maximized;

// 不在任务栏显示
this.ShowInTaskbar = false;
this.TopMost = true;

// 无边框
this.FormBorderStyle = FormBorderStyle.None;

// 在坐标为(55,88)的地方截取长宽为(520,233)的矩形
Rectangle rect = new Rectangle(55, 88, 520, 233);
g.DrawImage(btp, rect, rect, GraphicsUnit.Pixel);

this.Show();
}
————————————————
版权声明:本文为CSDN博主「卢然小子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_36381867/article/details/79434143

C#截图操作(几种截图方法)的更多相关文章

  1. python——几种截图对比方式!

    本次记录的几种截图对比方式,主要是为了在进行手机自动化测试时,通过截图对比来判断测试的正确性,方式如下: # -*- coding: utf- -*- ''' 用途:利用python实现多种方法来实现 ...

  2. 在Windows 10中截取截图的6种方式 简介

    在Windows 10中截取截图的6种方式 简介 截图对于不同的目的很重要.它可以用于捕获笔记本电脑上的任何内容的截图.所以,如果你使用Windows 10,你可能不知道如何截图,因为它是比较新的.因 ...

  3. Python + Selenium操作一:截图详解

    在做测试的时候,空口无凭都是白掐,特别是自动化测试的时候,更需要图片来佐证自己发现的问题 话不多说,直接进入主题,技术就是这么直白 Webdriver自带截图功能,get_screenshot_as_ ...

  4. python操作浏览器及截图小结

    近期做网页自动化用到内容小结 1.打开浏览器1)打开默认配置的浏览器from selenium import webdriverdriver = webdriver.Firefox()"&q ...

  5. Selenium+java - 截图操作

    写在前面 自动化测试过程中,运行失败截图可以很好的帮我们定位问题,因此,截图操作也是我们自动化测试中的一个重要环节. 截图方法 1.通过截图类TakeScreenshout实现截图 特点:截取浏览器窗 ...

  6. selenium窗口截图操作

    selenium窗口截图操作 使用背景:在自动化测试过程中,可能遇到执行错误情况,那么怎么样及时捕获出错信息/界面? 可以使用  get_screenshot_as_file(self,filenam ...

  7. javascript DOM和DOM操作的四种基本方法

    在了解了javascript的语言特性后,javascript真正大放光彩的地方来了——这就是javascript DOM Javascript DOM DOM(Document Object Mod ...

  8. 关于PHP的加载类操作以及其他两种魔术方法应用

    <?php 加载类//include("./Ren.class.php");//include "./Ren.class.php";include_onc ...

  9. Ocr答题辅助神器 OcrAnswerer4.x,通过百度OCR识别手机文字,支持屏幕窗口截图和ADB安卓截图,支持四十个直播App,可保存题库

    http://www.cnblogs.com/Charltsing/p/OcrAnswerer.html 联系qq:564955427 最新版为v4.1版,开放一定概率的八窗口体验功能,请截图体验(多 ...

  10. Selenium2学习-035-WebUI自动化实战实例-033-页面快照截图应用之三 -- 区域截图(专业版)

    之前有写过两篇博文讲述了 WebUI 自动化测试脚本中常用的截图方法,敬请参阅如下所示链接: 浏览器显示区域截图 浏览器指定区域截图 那么当需要截取的区域不在浏览器显示窗口范围之内时,之前的方法显然无 ...

随机推荐

  1. 浅谈python面向对象编程和面向过程编程的区别

    面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步步实现,使用的时候再一个个的依次调用即可. 优点:性能高 缺点:相较于面向对象而言,不易维护,不易复用,不易扩展 适合于小型的项目面向对象 ...

  2. 日记o3o

    12.17 段考超级烂,连sts都没考过,但是今晚来机房,nj发邮件的时候也给我发了,看来是可以继续学竞赛啦,很快心,也挺不开心的,毕竟以后想要跟上文化课就要很努力了,有能力但是得去花时间啊,寒假又要 ...

  3. Mysql数据基本操作(增、删、改、查)

    一.数据库配置 # 通过配置文件统一配置的目的: 统一管理 服务端(mysqld).客户端(client) 1.配置mysqld(服务端)的编码为utf-8,再创建数据库的时候,默认编码都采用了utf ...

  4. mitmproxy的使用

    一.介绍 中间人代理可以理解成和中间件差不多 mitmproxy工程工具包,主要包含了3个组件 mitmproxy:拦截的http(s)记录控制台显示 [window不支持] mitmdump:命令行 ...

  5. Java操作数据库——使用JDBC连接数据库

    Java操作数据库——使用JDBC连接数据库 摘要:本文主要学习了如何使用JDBC连接数据库. 背景 数据持久化 数据持久化就是把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应 ...

  6. PHP stat 文件系统函数

    定义和用法 stat - 给出文件的信息 版本支持 PHP4 PHP5 PHP7 支持 支持 支持 语法 stat ( string $filename ) 获取由 filename 指定的文件的统计 ...

  7. JavaScript动态加载script方式引用百度地图API 拓展---JavaScript的Promise

    上一篇博客JavaScript动态加载script方式引用百度地图API,Uncaught ReferenceError: BMap is not defined 这篇文章中我接触到一个新的单词:Pr ...

  8. Ubuntu16.04 安装 JDK

    1.到Oracle官网下载 地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...

  9. 移动网络游戏实现流程——并借此阐明pomelo在GitHub上各个项目间的关系

    <!DOCTYPE html> 摘要:本文通过一个简易流程图介绍如何基于Cocos2d-x引擎和pomelo服务器框架开发一个移动网络游戏.并借此阐明pomelo提供的各个项目间的关系. ...

  10. go语言设计模式之bridge

    著名的桥接模式罗.. bridge.go package bridge import ( "errors" "fmt" "io" ) typ ...