0

0

C# GDI+编程(四)

高洛峰

高洛峰

发布时间:2016-12-17 10:11:53

|

1606人浏览过

|

来源于php中文网

原创

截屏
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类里派生出来的。

 

企业黄页-大众投资指南整站 asp.net 2.0
企业黄页-大众投资指南整站 asp.net 2.0

大众投资指南是基于Asp.Net(2.0)+C#+Access(sql2000)的企业黄页类程序,是基于web2.0 模式的网站。 贴吧和黄页都有采集功能 主程序包括分类信息和商家黄页两大模块。分类信息支持二级分类,商家黄页支持二级地区分类及二级行业分类。程序采用了伪静态(url重写)技术,可选生成纯静态首页。 一、分类信息仿百度贴吧编写,可以分别对游客及会员设置不同的审核条件。会员发布信息

下载

双缓冲一次性绘图
 直接看一个没有使用双缓冲的例子吧,鼠标在窗口内移动的时候,左上角的矩形就显示鼠标当前的位置
    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                 for (int x = 0; 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中文网!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

178

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

35

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

79

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

2

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

4

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

8

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

24

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

122

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

72

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.8万人学习

C 教程
C 教程

共75课时 | 4.3万人学习

C++教程
C++教程

共115课时 | 14.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号