C#中GDI+图形图像技术(Graphics类、Pen类、Brush类)

目录

一、创建Graphics对象

1.创建Pen对象

2.创建Brush对象

(1)SolidBrush类

(2)HatchBrush类

​​​​​​​(3)LinerGradientBrush类


                用户界面上的窗体和控件非常有用,且引人注目,而有时还需要在屏幕上使用颜色和图形对象。只使用WinForms控件是不够的,还需要使用图形功能。通过使用图形,开发人员可以轻松地绘制他们的用户界面屏幕,并提供颜色、图形和对象。WinForms中的图形通过GDI+实现,GDI+是图形设备接口的高级版本。

        GDI+指的是.NET Framework和.NET 中提供二维图形、图像处理等功能,是构成Windows操作系统的一个子系统,它提供了图形图像操作的应用程序编程接口(API)。GDI+将应用程序与图形硬件分隔,使程序员能够创建与设备无关的应用程序。GDI+主要用于在窗体上绘制各种图形图像,可以用于绘制各种数据图形、数学仿真等。GDI+可以在窗体程序中产生很多自定义的图形,便于开发人员展示各种图形化的数据。

         本文所有示例的环境:VS2022,.NET 8.0,Windows窗体应用。

一、创建Graphics对象

        Graphics类是GDI+的核心,提供将对象绘制到显示设备的方法。Graphics与特定的设备上下向关联,是用于创建图形图像的对象。Graphics类封装了绘制直线、曲线、图形、图像和文本的方法,是进行一切GDI+操作的基础类。创建Graphics对象有以下3种方法。

☑ 在窗体或控件的Paint事件中创建,将其作为PaintEventArgs的一部分。在为控件创建绘制代码时,通常会使用此方法来获取对图形对象的引用。
private void Form1_Paint(object sender,PaintEventArgs e)
{Graphics g =e.Graphics;}
☑ 调用控件或窗体的CreateGraphics()方法以获取对Graphics对象的引用,该对象表示控件或窗体的绘图画面。如果在已存在的窗体或控件上绘图,应该使用此方法。
private void Form1_Load(object sender,EventArgs e){
Graphics g;
g=this.CreateGraphics();}
☑ 由从Image继承的任何对象创建Graphics对象,此方法在需要更改已存在的图像时十分有用。
private void Form1_Load(object sender,EventArgs e){
Bitmap mbit =new Bitmap(@"C:\s.bmp"); 
graphics g =Graphics.Fromlmage(mbit);}

        当不再需要返回的Graphics时,必须通过调用其Dispose()方法来释放它。Graphics只在当前窗口消息期间有效。

1.创建Pen对象

        Pen类主要用于绘制线条,或者线条组合成的其他几何形状。

public Pen (Color color,float width)
☑ color:设置Pen的颜色。
☑ width:设置Pen的宽度。

2.创建Brush对象

        Brush类主要用于填充几何图形。Brush类是一个抽象基类,不能进行实例化。若要创建一个画笔对象,需使用从Brush派生出的类,如SolidBrush、HatchBrush等。

(1)SolidBrush

        SolidBrush类定义单色画笔,画笔用于填充图形形状。

public SolidBrush(Color color)
color:表示此画笔的颜色。
//Form1_Paint事件
namespace _Graphics
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Button1_Click(object sender, EventArgs e)
        {
            Graphics ghs = CreateGraphics();		//创建Graphics对象
            Brush mybs = new SolidBrush(Color.Red);	//使用SolidBrush类创建一个Brush对象
            Rectangle rt = new(10, 10, 145, 110);   //绘制一个矩形
            ghs.FillRectangle(mybs, rt);		    //用Brush填充Rectangle
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Text = "绘制红色矩形实体";
            button1.AutoSize = true;
            button1.Location = new Point(27, 126);
            ClientSize = new Size(164, 161);
        }
    }
}

​​​​​​​(2)HatchBrush

        HatchBrush类提供了一种特定样式的图形,用来制作填满整个封闭区域的绘图效果。

public HatchBrush (HatchStyle hatchstyle,Color foreColor)
☑ hatchstyle:HatchStyle值之一,表示此HatchBrush所绘制的图案。 
☑ foreColor:Color结构,它表示此HatchBrush所绘制线条的颜色。
//利用HatchStyle值,绘制5阶梯
using System.Drawing.Drawing2D;

namespace _02
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Text = "绘制阶梯";
            button1.Location = new Point(207, 12);
            ClientSize = new Size(294, 311);
        }

        private void Button1_Click(object sender, EventArgs e)
        {         
            Graphics ghs = CreateGraphics();				//创建Graphics对象
            for (int i = 1; i < 6; i++)						//使用for循环
            {
                HatchStyle hs = (HatchStyle)(5 + i);		//设置HatchStyle值
                HatchBrush hb = new(hs, Color.White);		//实例化HatchBrush类
                Rectangle rtl = new(10, 50 * i, 50 * i, 50);//根据i值绘制矩形
                ghs.FillRectangle(hb, rtl);					//填充矩形
            }
        }
    }
}

​​​​​​​(3)LinerGradientBrush

        LinerGradientBrush类提供一种渐变色彩的特效,填满图形的内部区域。在使用LinerGradientBrush类时,必须在命名空间中添加System.Drawing.Drawing2D。

public LinerGradientBrush(Point point1,Point point2,Color color1,Color color2)

        LinerGradientBrush类的参数及说明

参    数

说   明

point

表示线形渐变的开始点

point2

表示线形渐变的结束点

color

表示线形渐变的开始色彩

color2

表示线形渐变的结束色彩

//通过LinerGradientBrush类绘制线形渐变图形
using System.Drawing.Drawing2D;
namespace _03
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            //实例化两个Point类
            Point p1 = new(100, 100);
            Point p2 = new(150, 150);
            //实例化LinerGradientBrush类,设置其使用黑色和白色进行渐变
            LinearGradientBrush lgb = new(p1, p2, Color.Black, Color.White);
            Graphics ghs = CreateGraphics();					//实例化Graphics类
            //设置WrapMode属性指示该LinearGradientBrush的环绕模式
            lgb.WrapMode = WrapMode.TileFlipX;
            ghs.FillRectangle(lgb, 15, 15, 150, 150);		   //填充绘制矩形
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/215655.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全球与中国工业冰箱市场:增长趋势、竞争格局与前景展望

工业制冷机是用来维持储运容器内低温冷藏环境&#xff0c;以防止食品饮料、药品、化学品等对温度敏感的产品腐败变质的系统。此外&#xff0c;冷冻机、热交换器等冷冻系统也用于在工业机械运作过程中保持冷却。工业冷冻系统的需求成长主要是由食品和饮料产业的成长所推动的。 冷…

成为AI产品经理——回归模型评估(MSE、RMSE、MAE、R方)

分类问题的评估是看实际类别和预测类别是否一致&#xff0c;它的评估指标主要有混淆矩阵、AUC、KS。回归问题的评估是看实际值和预测值是否一致&#xff0c;它的评估指标包括MAE、MSE、RMSE、R方。 如果我们预测第二天某支股票的价格&#xff0c;给一个模型 y1.5x&#xff0c;…

Python+OpenCV实现最强自动扫雷

文章目录 准备实现思路窗体截取雷块分割雷块识别扫雷算法实现关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 用…

【C++初阶】六、类和对象(初始化列表、static成员、友元、内部类)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】五、类和对象 &#xff08;日期类的完善、流运算符重载函数、const成员、“&”取地址运算符重载&#xff09;-CSDN博客 目录 ​​​​​​​一 . 初始化列表 构造函数…

涵盖多种功能,龙讯旷腾Module第三期:光、磁、力学和极化性质

Module是什么 在PWmat的基础功能上&#xff0c;我们针对用户的使用需求开发了一些顶层模块&#xff08;Module&#xff09;。这些Module中的一部分是与已有的优秀工具的接口&#xff0c;一部分是以PWmat的计算结果为基础得到实际需要的物理量&#xff0c;一部分则是为特定的计…

孩子都能学会的FPGA:第二十课——用FPGA实现定点数的开方运算

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

Cysteine Protease inhibitor半胱氨酸蛋白酶抑制剂

Cysteine Protease inhibitor 半胱氨酸蛋白酶抑制剂 921625-62-9 英文名称&#xff1a;Cysteine Protease inhibitor 中文名称&#xff1a;半胱氨酸蛋白酶抑制剂 化学名称&#xff1a;5-氨基-3-苯基-1,2,4-噻二唑 CAS&#xff1a;921625-62-9 外观&#xff1a;固体粉末 分子…

如何打印社保参保凭证

西安市&#xff1a; 陕西政务服务网&#xff1a; 个人服务 珠海市&#xff1a; 广东政务服务网&#xff1a; 用户登录 | 珠海市人力资源和社会保障网上服务平台 武汉市&#xff1a; 湖北政务服务网&#xff1a; 湖北政务服务网

基于Springboot的秒杀系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的秒杀系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xf…

Cesium 顶点吸附和区域拾取

Cesium 顶点吸附和区域拾取 基于深度实现可以自定义拾取范围大小 // 顶点吸附// const result pickAreaHelper.pickNearest(viewer.scene, movement.endPosition, 32, 32);// 区域拾取const result pickAreaHelper.pickArea(viewer.scene, movement.endPosition, 32, 32);顶…

maven篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、如何解决依赖传递引起的版本冲突?二、说说maven的依赖原则三、说说依赖的解析机制?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享…

硬件基础:MOS管

MOSFET概述 MOSFET由MOS(Metal Oxide Semiconductor金属氧化物半导体)FET(Field Effect Transistor场效应晶体管)这个两个缩写组成&#xff0c;即全称为金属氧化物场效应管&#xff0c;简称MOS管。 即通过给金属层(M-金属铝)的栅极和隔着氧化层(O-绝缘层SiO2)的源极施加电压&am…

【Erlang进阶学习】4、进程与消息传递

在Erlang系统中&#xff0c;进程都是轻量级的&#xff0c;意味着创建进程只需要花费微不足道的时间和极少的内存。 1、进程间不共享内存&#xff0c;而是通过消息传递来通信。 2、消息从发送进程的栈上复制到接收进程的堆上。 3、由于多个进程并发地在独立的内存空间执行&#…

easyrecovery2024最新破解版激活密钥

平时很多人都会把自己工作时&#xff0c;或者生活中的数据存储在我们的电脑上&#xff0c;很多时候&#xff0c;由于我们的误操作或者是其它某些问题&#xff0c;很容易就会误删除一些文件数据了&#xff0c;尤其是一些电脑出现故障&#xff0c;总是会导致数据丢失&#xff0c;…

【flink番外篇】1、flink的23种常用算子介绍及详细示例(1)- map、flatmap和filter

Flink 系列文章 1、Flink 专栏等系列综合文章链接 文章目录 Flink 系列文章一、Flink的23种算子说明及示例1、maven依赖2、java bean3、map4、flatmap5、Filter 本文主要介绍Flink 的3种常用的operator&#xff08;map、flatmap和filter&#xff09;及以具体可运行示例进行说明…

kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录

kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录 1. k8s环境 k8s使用kubernetes-server-linux-amd64_1.19.10.tar.gz 二进制bin 的方式手动部署 k8s 版本: [rootmaster ~]# kubectl version Client Version: version.Info{Major:"1", Minor:&…

【python】——函数

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

【改进YOLOV8】融合动态蛇形卷积&DCNV2的草莓分级分割分割系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着计算机视觉技术的不断发展&#xff0c;图像分割成为了一个重要的研究领域。图像分割可以将图像中的不同对象或区域进行分离&#xff0c;从而更好地理解图像内…

在 App 设计工具的代码视图中管理代码

目录 管理组件、函数和属性 识别代码中的可编辑部分 编写 App 管理 UI 组件 管理回调 在 App 中共享数据 在多个位置运行的单一源代码 创建输入参数 为您的 App 添加帮助文本 限制您的 App 一次只运行一个实例 修复代码问题和运行时错误 个性化代码视图外观 更改颜…

线程的使用1

1. 创建一个线程 1.1 创建线程练习 线程实际上是应用层的概念&#xff0c;在 Linux 内核中&#xff0c;所有的调度实体都被称为任务 (task) &#xff0c; 他们之间的区别是&#xff1a;有些任务自己拥有一套完整的资源&#xff0c;而有些任务彼此之间共享一套资源 对此函数的使…