截屏
Grahpics类里的CopyFromScreen函数,可以把屏幕拷贝到Graphics对象里。如果Graphics对象是从窗口Form里创建的,那么屏幕就直接
显示在窗口里。看例子:给窗口添加一个按钮,然后给这个按钮添加单击事件处理函数。
函数里的代码如下:
private void button1_Click(object sender, EventArgs e)
{
this.CreateGraphics().CopyFromScreen(50,50, 0, 0, this.Size,CopyPixelOperation.SourceCopy);
}
第一个参数和第二个参数,指明是从屏幕的哪里开始复制,而后面的0,0,就是把屏幕复制到窗口里了,从窗口哪里开始显示。
this.Size是要复制的大小(宽高)。
是VC++里的。这里只不过换了种说法而已。最终的结果还是一样的。
之前的Graphics对象创建,都是通过窗口的, 这次我们通过图片来创建Graphics对象,这样我们就可以在图片上进行绘制了。
而图片对象的创建,并不是只有加载文件这一个方式。我们可以创建一个“空”位图(通过构造函数),这种位图里面没有具体的数据,或者说里面的默认数据,没有用而已,我们只是需要这么个容器。在里面绘图,添加数据进去。
例子:截屏并把图片保存为文件
private void button1_Click(object sender, EventArgs e)
{
//创建Bitmap图片,800宽,600高,这么个大小的容器。
Bitmap bmp = new Bitmap(800, 600);
//从图片里创建Grahpics对象
Graphics gr = Graphics.FromImage(bmp);
//拷贝屏幕到Bitmap
gr.CopyFromScreen(0, 0, 0, 0, new Size(800, 600), CopyPixelOperation.SourceCopy);
//保存为图片文件
bmp.Save("d:\\screen.jpg");
}
怎么样,够简单的吧,四行代码就完成了屏幕截图,并保存为文件,VC++可是要很多行代码。另Bitmap是从Image类里派生出来的。
双缓冲一次性绘图
直接看一个没有使用双缓冲的例子吧,鼠标在窗口内移动的时候,左上角的矩形就显示鼠标当前的位置
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.MouseMove += formMouseMove;
}
private void formMouseMove(object sender, MouseEventArgs e)
{
Graphics gr = this.CreateGraphics();
Rectangle rect = new Rectangle(0, 0, 100, 35);
//填充矩形
LinearGradientBrush brush =
new LinearGradientBrush(rect, Color.FromArgb(44, 55, 66), Color.FromArgb(123, 150, 189),
LinearGradientMode.Horizontal);
gr.FillRectangle(brush, rect);
//画矩形
Pen pen = new Pen(Color.Green, 2);
gr.DrawRectangle(pen, rect);
//显示文本
gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
String str = String.Format("鼠标位置:\n{0},{1}", e.X, e.Y);
gr.DrawString(str, new Font("黑体", 11),Brushes.White, rect);
}
}
可以看到,当鼠标移动的时候,左上角的矩形明显闪烁了,这是因为进行了三次绘制,填充矩形,画矩形,显示文本。才导致的。
当绘制的次数越多,这个闪烁就越明显。
而这三次绘制最终只要得到一个结果,也就是得到一张图片,那么我们就可以使用双缓冲来完成了,先把要绘制的图形绘制到Bitmap里面。然后再把Bitmap绘制到窗口就行了。
看例子:
private void formMouseMove(object sender, MouseEventArgs e)
{
Graphics graphics = this.CreateGraphics();
//从Bitmap里创建Graphics对象
Bitmap bmp=new Bitmap(100,35);
Graphics gr = Graphics.FromImage(bmp);
Rectangle rect = new Rectangle(0, 0, 100, 35);
//填充矩形
LinearGradientBrush brush =
new LinearGradientBrush(rect, Color.FromArgb(44, 55, 66), Color.FromArgb(123, 150, 189),
LinearGradientMode.Horizontal);
gr.FillRectangle(brush, rect);
//画矩形
Pen pen = new Pen(Color.Green, 2);
gr.DrawRectangle(pen, rect);
//显示文本
gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
String str = String.Format("鼠标位置:\n{0},{1}", e.X, e.Y);
gr.DrawString(str, new Font("黑体", 11),Brushes.White, rect);
//一次性绘制
graphics.DrawImage(bmp, 0, 0);
}
获取窗口(控件)的Bitmap
DrawToBitmap函数,可以把窗口或控件的外观绘制到Bitmap里。它属于Control类,而窗口类和控件类都是从Control类派生出来的。
看例子:(一个按钮单击事件处理函数的代码)
private void button1_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(Width, Height);
this.DrawToBitmap(bmp, new Rectangle(0, 0, Width, Height));
bmp.Save("d:\\form.jpg");
}
DrawToBitmap的第二个参数,是窗口显示在Bitmap里的区域。这个是不能缩小或放大图片的,窗口的大小和Bitmap的大小是一致的,
如果填10,10,50,50那就是窗口的0,0,50,50显示在位图的10,10,50,50矩形区域内,窗口起始位置是不是能指定的,只能从位置0,0开始。
获取一个像素点的值
Bitmap类里GetPixel函数可以获取一个像素点的Color值,如果要获取窗口某一个像素点的颜色值,可以先调用DrawToBitmap函数,把
窗口保存成Bitmap。然后再获取。另:还有对应的函数SetPixel设置一个像素的颜色值。
获取Png图片显示区域,创建不规则窗口。
获取Png图片区域可以用GetPixel函数,获取图片里每一个像素点的颜色值,如果Alpha值为0的话,那就是透明的,否则把这个点加入区域。那么要如何获取一个Color对象的Alpah值呢,调用ToArgb成员函数,这个是32位整数,刚好可以存储4个8位字节的数值:A,R,G,B。
看下示例吧,把Alpha值提取出来
{
Color cor1 = Color.FromArgb(123,225,229,230);
//获取Color的argb值
int argb = cor2.ToArgb();
//转换成字符数组
byte[] bargb = BitConverter.GetBytes(argb);
//bargb[3]存储的是Alpha值
String str = String.Format("{0},{1},{2},{3}", bargb[0], bargb[1], bargb[2], bargb[3]);
MessageBox.Show(str);
}
一个完整的示例,获取PNG显示区域
示例代码:
public Form1()
{
InitializeComponent();
//存储PNG非透明部分的路径
GraphicsPath path = new GraphicsPath();
//加载PNG图片
Bitmap bmp = new Bitmap("d:\\Image\\win.png");
//判断每个像素的颜色值,获取图片的显示区域
for (int y = 0; y < bmp.Height; y++)
for (int x = 0; x < bmp.Width; x++)
{
Color cor = bmp.GetPixel(x, y);
int argb = cor.ToArgb();
byte[] bargb = BitConverter.GetBytes(argb);
//像素颜色值不是透明的
if (bargb[3] != 0)
{
//把这个像素点区域添加到路径里去
path.AddRectangle(new Rectangle(x, y, 1, 1));
}
}
//设置窗口显示区域,通过路径创建区域
this.Region = new Region(path);
}
但是这个方法有点不可靠,如果PNG图片里有些像素点的颜色值是半透明的,这样就得不到想要的外观结果。虽然看着PNG图片里有些地方好像是透明的。
解决方法就是自己来做PNG图片,按你自己的规则来。不要从网上找。
设置了不规则窗口,就可以把那张PNG图片绘制到窗口里去了,但由于半透明的问题,得先用透明画刷填充窗口,然后再绘制。
不过还有一个问题,非客户区窗口绘制,像我们之前的绘制,都是在窗口客户区里绘制的。
如果要绘制的图片和窗口对应起来的话,得从非客户区域开始绘制。这个要怎么做到呢。下一章再说吧。
更多C# GDI+编程(四)相关文章请关注PHP中文网!

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

C#在.NET中的编程过程包括以下步骤:1)编写C#代码,2)编译为中间语言(IL),3)由.NET运行时(CLR)执行。C#在.NET中的优势在于其现代化语法、强大的类型系统和与.NET框架的紧密集成,适用于从桌面应用到Web服务的各种开发场景。

C#是一种现代、面向对象的编程语言,由微软开发并作为.NET框架的一部分。1.C#支持面向对象编程(OOP),包括封装、继承和多态。2.C#中的异步编程通过async和await关键字实现,提高应用的响应性。3.使用LINQ可以简洁地处理数据集合。4.常见错误包括空引用异常和索引超出范围异常,调试技巧包括使用调试器和异常处理。5.性能优化包括使用StringBuilder和避免不必要的装箱和拆箱。

C#.NET应用的测试策略包括单元测试、集成测试和端到端测试。1.单元测试确保代码的最小单元独立工作,使用MSTest、NUnit或xUnit框架。2.集成测试验证多个单元组合的功能,常用模拟数据和外部服务。3.端到端测试模拟用户完整操作流程,通常使用Selenium进行自动化测试。

C#高级开发者面试需要掌握异步编程、LINQ、.NET框架内部工作原理等核心知识。1.异步编程通过async和await简化操作,提升应用响应性。2.LINQ以SQL风格操作数据,需注意性能。3..NET框架的CLR管理内存,垃圾回收需谨慎使用。

C#.NET面试问题和答案包括基础知识、核心概念和高级用法。1)基础知识:C#是微软开发的面向对象语言,主要用于.NET框架。2)核心概念:委托和事件允许动态绑定方法,LINQ提供强大查询功能。3)高级用法:异步编程提高响应性,表达式树用于动态代码构建。

C#.NET是构建微服务的热门选择,因为其生态系统强大且支持丰富。1)使用ASP.NETCore创建RESTfulAPI,处理订单创建和查询。2)利用gRPC实现微服务间的高效通信,定义和实现订单服务。3)通过Docker容器化微服务,简化部署和管理。

C#和.NET的安全最佳实践包括输入验证、输出编码、异常处理、以及身份验证和授权。1)使用正则表达式或内置方法验证输入,防止恶意数据进入系统。2)输出编码防止XSS攻击,使用HttpUtility.HtmlEncode方法。3)异常处理避免信息泄露,记录错误但不返回详细信息给用户。4)使用ASP.NETIdentity和Claims-based授权保护应用免受未授权访问。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

禅工作室 13.0.1
功能强大的PHP集成开发环境

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver CS6
视觉化网页开发工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。