首页 > 编程语言 >C#中的GDI+图像编程详解

C#中的GDI+图像编程详解

时间:2024-03-01 15:11:51浏览次数:25  
标签:10 C# Region Graphics Color 详解 new GDI Rectangle

本文详细讲解了C#中的GDI+图像编程,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值。

一、Graphics

GDI+是GDI(Windows Graphics Device Interface)的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像,可以用于绘制各种数据图像、数学仿真等。

Graphics类是GDI+的核心,它提供将对象绘制到显式设备的方法。Graphics类封装了绘制直线、曲线、圆形、图像和文本的方法,是一切GDI+操作的基础类。在绘图之前,必须在指定的窗体上创建一个Graphics对象,才能调用Graphics类的方法画图。

1、创建Graphics类对象

1、Paint事件
在窗体或控件的Paint事件中创建,将其作为PaintEventArgs的一部分。在为控件创建绘制代码时,通常会使用此方法。  

例如,在Paint事件中创建Graphics对象:

1 2 3 4 5 6 7 8 9 10 public partial class Form1 : Form {     protected override void OnPaint(PaintEventArgs e)     {         base.OnPaint(e);           Graphics g = e.Graphics; // e.ClipRectangle;//剪切区域,即被遮挡的部分         g.DrawLine(Pens.Wheat, 0, 0, 2, 2);     } }

2、 CreateGraphics方法
调用窗体或控件的CreateGraphics方法可以获取对Graphics对象的引用,该对象表示控件或窗体的绘图画面。如果在已存在的窗体或控件身上绘图,应该使用此方法

例如,在窗体的Load事件中,通过CreateGraphics方法创建Graphics对象

1 2 3 4 5 private void Form1_Load(object sender, EventArgs e)    //窗体的Load事件 {     Graphics g;    //声明一个Graphics对象     g = this.CreateGraphics(); }

3 、Graphics.FromImage方法
由从Image继承的任何对象创建Graphics对象,调用Graphics.FromImage方法即可,该方法在需要更改已存在的图像时十分有用,例:

1 2 3 4 5 private void Form1_Load(object sender, EventArgs e) {     Bitmap mbit = new Bitmap(@"C:\test.bmp");     Graphics g = Graphics.FromImage(mbit); }

2、Graphics类的属性

  • Clip    获取或设置 Region,它限定此 Graphics 的绘图区域。
  • ClipBounds    获取一个 RectangleF 结构,该结构限定此 Graphics 的剪辑区域。
  • VisibleClipBounds    获取此 Graphics 的可见剪辑区域的边框。
  • CompositingQuality    获取或设置绘制到此 Graphics 的合成图像的呈现质量。
  • SmoothingMode    获取或设置此 Graphics 的呈现质量。
  • DpiX    获取此 Graphics 的水平分辨率。
  • DpiY    获取此 Graphics 的垂直分辨率。
  • PageScale    获取或设置此 Graphics 的世界单位和页单位之间的比例。
  • PageUnit    获取或设置用于此 Graphics 中的页坐标的度量单位。

3、Graphics类的常用方法

  • 画线条
    DrawLine    绘制一条连接由坐标对象指定的两个点的线条
    DrawLines    绘制一列连接一组Point结构的线段
    DrawBezier    绘制由四个Point结构定义的贝塞尔样条
    DrawBeziers    从Point结构的数组绘制一系列贝塞尔样条
    DrawCurve    绘制经过一组指定的Point结构的基数样条
  • 画可填充线条
    DrawEllipse    绘制一个由一对坐标、宽度和高度指定的椭圆
    DrawPath    绘制GraphicsPath对象
    DrawPie    绘制一个扇形,该扇形由一个坐标对象,宽度和高度,以及两条射线所指定的椭圆指定
    DrawPolygon    绘制由一组Point结构定义的多边形
    DrawRectangle    绘制由坐标对。宽度和高度指定的矩形
    DrawRectangles    绘制一系列由Rectangle结构指定的矩形
    DrawArc    绘制一段弧线,它表示由一对坐标、宽高指定的椭圆部分
  • 填充区域
    FillEllipse    填充边框所定义的椭圆内部,该边框由一对坐标、一个高度和一个宽度指定
    FillPath    填充GraphicsPath对象的内部
    FillPie    填充扇形内部
    FillPolygon    填充多边形内部
    FillRectangle    填充由一对坐标、一个宽度和一个高度指定的矩形内部
    FillRectangles    填充由Rectangle结构指定的一些列矩阵的内部
    FillRegion    填充Region对象的内部
  • 画字符串、图画、图标
    DrawString    在指定位置并且用指定的Brush和Font对象绘制指定的文本字符串
    DrawIcon    在指定坐标处绘制由指定的Icon对象表示的图像
    DrawImage    在指定的位置并且按原始大小绘制指定的Image对象
  • 其他
    MeasureString(String, Font)    测量用指定的 Font 绘制的指定字符串。
    FromImage    从指定的Image对象创建行的Graphics对象
    Save    保存此Graphics对象的当前状态,并且GraphicsState对象标识保存的状态
    Clear    清除整个绘图面并以指定背景色填充
    Dispose    释放由此Graphics对象使用的所有资源

二、坐标系统

GDI+定义了三种坐标系统,并提供了三种坐标转换的方法Graphics.TransformPoints()。

  • 全局坐标系统。
  • 页面(Page)坐标系统:左上角为原点,横向x轴向右为正方向,纵向y轴向下为正方向。单位为像素。这是默认的坐标系统。
  • 设备坐标系统:可以指定特定测量单位的页面(Page)坐标系统。如果单位为像素,和页面(Page)坐标系统相同。

1、点结构:Point和PointF

点结构有两个成员:X,Y,表示点的x轴和y轴的坐标。其常用构造函数如下:

1 2 Point p1=new Point(int X,int Y);//X,Y为整数 PointF p2=new PointF(float X,floa Y);//X,Y为浮点数

2、尺寸结构Size和SizeF

Size和SizeF用来表示尺寸大小,有两个成员:Width和Height。常用构造函数如下:

1 2 public Size(int width,int height); public SizeF(float width,float height);

3、矩形结构Rectangle和RectangleF

结构Rectangle和RectangleF用来表示一个矩形,常用属性如下:

  • Top、Left,Bottom, Right:Rectangle结构坐标
  • Width、Height:获取或设置此Rectangle结构的宽、高度。
  • Size:获取或设置此Rectangle的大小。
  • X、Y:获取或设置此Rectangle结构左上角的x,Y坐标。

其常用构造函数为:

1 2 3 4 //参数为矩形左上角坐标的点结构location和代表矩形宽和高的Size结构size Rectangle(Point location,Size size);//参数也可为PointF和SizeF //参数为矩形左上角x和y坐标,宽,高 Rectangle(int X,int Y,int width,int height);//X和Y也可为float

4、路径类GraphicsPath

GraphicsPath 类表示一系列相互连接的直线和曲线。 此类不能被继承。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Graphics g = e.Graphics; g.FillRectangle(Brushes.White, this.ClientRectangle);   GraphicsPath gp = new GraphicsPath();   gp.AddLine(10, 10, 10, 50); gp.AddBezier(10, 50, 10, 55, 25, 70, 30, 70); gp.AddLine(30, 70, 60, 70); //闭合图形 gp.CloseFigure();   //GraphicsPath类本身没有提供显示创建路径的功能,所以需要把路径对象传给Graphics类的一个方法来显示 g.DrawPath(Pens.Black, gp); g.FillPath(Brushes.Orange, gp);//给路径填充橘黄色, gp.Dispose(); g.Dispose();

5、区域类Region类

Region类表示由矩形或由路径构成图形形状的内部

1、从GraphicsPath路径对象中创建区域,

1 2 3 4 5 6 7 8 9 10 11 GraphicsPath gp = new GraphicsPath();   gp.AddLine(10, 10, 10, 50); gp.AddBezier(10, 50, 10, 55, 25, 70, 30, 70); gp.AddLine(30, 70, 60, 70); //闭合图形 gp.CloseFigure();   Region reg = new Region(gp);   //从GraphicsPath对象创建Region对象 //填充区域 g.FillRegion(Brushes.Green, reg);

2.从各类图形中创建:

1 Region reg = new Region(new Rectangle(10, 10, 80, 20));

3.从一个区域中创建另一个区域

1 2 3 Region r1 = new Region(new Rectangle(10, 10, 80, 20)); RegionData r1Data = r1.GetRegionData();//区域数据 Region r2 = new Region(r1Data);  //构造函数不接受区域对象本身,可以接受区域数据数组。

4.区域的并集和交集

示例:

1 2 3 4 5 6 7 8 9 10 11 Graphics g = e.Graphics; Rectangle rect1 = new Rectangle(50, 10, 50, 130); Rectangle rect2 = new Rectangle(10, 50, 130, 50); //设置Region为第一个矩形 Region reg = new Region(rect1); //用Rect2提取Region中的交集 reg.Intersect(rect2);   g.FillRegion(Brushes.Orange, reg); g.DrawRectangle(Pens.Black, rect1); g.DrawRectangle(Pens.Black, rect2);

三、颜色

1、Color结构

Color结构表示颜色,结构中包含一个无符号32位数代表颜色。任何一种颜色可以用ARGB颜色(alpha、红、绿、蓝)表示。Color结构通过表态属性公开了140个命名颜色。。常用方法如下:

  • public static Color FromArgb(int alpha,int rr,int gg,int bb);
    从四个分量(透明度、红色、绿色和蓝色)值创建Color结构。每个分量的值仅限于8位(小于256)。alpha值表示透明度,=0为完全透明,=255为完全不透明
  • public static Color FromArgb(int rr,int gg,int bb);
    从指定的8位颜色值(红色、绿色和蓝色)创建Color结构。透明度值默认为255(完全不透明)。每个分量的值仅限于8位(小于256)。红色为(255,0,0),绿色为(0,255,0),蓝色为(0,0,255)。
  • public static Color FromArgb(int alpha,Color color);
    从指定的Color结构创建新Color结构,使用新指定的透明度值alpha。alpha值仅限于8位。

创建实例

1 2 3 4 5 //创建Color实例的参数为 r,g,b; //参数为红,绿,蓝三种原色,透明度为默认,即完全不透明. Color cl = Color.FromArgb(200, 200, 200);   //调用静态FromName方法 Color cl = Color.FromName("PowderBlue");  //字符串参数必须包含一个KnownColor枚举值的名称.

使用颜色:

1 2 3 4 Color red=Color.Red; red.GetBrightness(); red.GetHue(); red.GetSaturation();

2、ColorTranslator类

  • FromHtml(String)    将 HTML 颜色表示形式翻译成 GDI+ Color 结构。
1 2 Color myColor = ColorTranslator.FromHtml("Blue"); Color myColor = ColorTranslator.FromHtml("H00000");
  • ToHtml(Color)    将指定的 Color 结构翻译成 HTML 字符串颜色表示形式。
1 2 string htmlColor = ColorTranslator.ToHtml( Color.Red); string htmlColor = ColorTranslator.ToHtml( Color.FromArgb(255,255,255));

四、画笔Pen类

画笔,定义用于绘制直线和曲线的对象。

定义画笔:

1 2 Pen pen1 = new Pen(Color, Single); //参数为颜色Color,单精度浮点数Sigle;宽度默认为1; Pen pen2 = Pen(Brush, Single);  // 使用指定的 Pen 和 Brush 初始化 Width 类的新实例。

使用画笔:

1 2 3 4 5 6 7 //画实线 Pen pen = new Pen(Color.Red, 3); //确定线的首位位置 Point point1 = new Point(10, 50); Point point2 = new Point(250, 50); Graphics g = this.CreateGraphics(); g.DrawLine(pen, point1, point2);

五、画刷Brush

画刷:定义用于填充图形形状(如矩形、椭圆、饼形、多边形和封闭路径)的内部的对象。只是一个抽象基类。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Rectangle rect1 = new Rectangle(20, 80, 250, 100);   // (实心实心刷) SolidBrush sbrush = new SolidBrush(Color.DarkOrchid);   //(纹理刷) TextureBrush textureBrush = new TextureBrush(new Bitmap(@"e:/123.jpg"));   //(梯度、线性渐进刷) LinearGradientBrush lbrush = new LinearGradientBrush(rect1, Color.DarkOrange, Color.Aquamarine, 45);   //路径渐进画刷 PathGradientBrush pathbrush = new PathGradientBrush(graphicsPath);   //(阴影刷) HatchBrush hbrush = new HatchBrush(HatchStyle.DiagonalCross, Color.DarkOrange, Color.Aquamarine);   e.Graphics.FillRectangle(sbrush, rect1);         // (实心刷) e.Graphics.FillRectangle(textureBrush, rect1);       //(纹理刷) e.Graphics.FillRectangle(lbrush, rect1);            //(梯度刷) e.Graphics.FillRectangle(hbrush, rect1);             //(阴影刷)

六、字体 Font

Font类有两个构造函数:

第一个是new Font(字体名称,字号),例如,label1.Font=new Font("黑体",9)。

第二个是new Font(字体名称,字号,字体风格),其中第三个参数是枚举类型。

定义字体:

1 2 3 4 5 //例如修改标签控件字体为斜体: label1.Font=new Font("黑体",9,label1.Font.Style|FontStyle.Italic);   //修改标签控件字体不为斜体: label1.Font=new Font("黑体",9,label1.Font.Style&~FontStyle.Italic);

字体用法

1 2 3 4 5 6 // Create font and brush. Font drawFont = new Font("Arial", 16); SolidBrush drawBrush = new SolidBrush(Color.Black);   // Draw string to screen. e.Graphics.DrawString("Sample Text", drawFont, drawBrush,  new PointF(150.0F, 150.0F));

七、图像

图像Image类、打印Printing相关

标签:10,C#,Region,Graphics,Color,详解,new,GDI,Rectangle
From: https://www.cnblogs.com/soliang/p/18047095

相关文章

  • Pycharm:在工程目录下新建一个Python.exe
    1、起因公司电脑上把Python安装在了系统盘,但是我没有系统盘的修改权限,导致用pip时无法把包安装到系统盘2、解决方案在工程目录下,为工程新建一个Python.exe,之后该工程都采用这个python和它的pip,把包安装在工程包下。1)File→Settings→Project:xxx→PythonInterpreter2)Python......
  • 核心子方法5: invokeBeanFactoryPostProcessors(beanFactory)方法详解
    先总结: 该方法通过指定顺序,遍历调用各种实现了BeanDefinitionRegistryPostProcessor接口或BeanFactoryPostProcessor接口,的beanFactory后处理器注: BeanDefinitionRegistryPostProcessor接口继承了BeanFactoryPostProcessor接口调用顺序: 1.先调用已经提前放入Applicat......
  • C++static 存储类
    1#include<iostream>23//函数声明4voidfunc(void);56intmain()7{8intcount=10;9while(count--)10{11func();12std::cout<<",变量count为"<<count<<std::endl;13......
  • [转]acme自动化---免费SSL证书申请并自动续期
    原文地址:acme自动化---免费SSL证书申请并自动续期_createnewordererror.le_orderfinalizenotfound-CSDN博客背景:各CA厂家都在缩短免费证书的有效时间,包括现在与阿里合作的,普遍只有90天,这样如果频繁手动申请更换就很繁琐,正好github上有一个star数很高的工具acme.sh,......
  • python生成Excel文件减少使用内存
    1、openpyxl模块生成2、xlsxwriter模块contant_memory=True生成TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplifiedHungarianRussianChineseTraditionalIndonesianSlovak......
  • .NET Core(.NET6)中gRPC使用
    目录一、简介二、创建gRPC服务端1.创建gRPC项目2.编写自己的服务三、创建gRPC客户端1.创建客户端项目2.grPC服务https的调用3.gRPC内网http调用4.IOC注入的方式调用gRPC四、webapi中加入gRPC 回到顶部一、简介简单解析一下gRPC,gRPC是一个由Google开源......
  • CloudCanal x Hive 构建高效的实时数仓
    简述CloudCanal最近对于全周期数据流动进行了初步探索,打通了Hive目标端的实时同步,为实时数仓的构建提供了支持,这篇文章简要做下分享。基于临时表的增量合并方式基于HDFS文件写入方式临时表统一Schema任务级的临时表基于临时表的增量合并方式Hive目标端写入方式和......
  • 单片机开发中pc和sp的作用
    概念两个都是寄存器pc(programcounter)程序计数器SP(stackpointer)堆栈指针原理pc存放下一条指令的寄存器,cpu从内存中拿指令,寄存器是属于cpu的一部分,不属于内存sp堆栈指针,本质是寄存器,指向堆栈的顶部,爬论坛:https://www.cnblogs.com/uestcliming666/p/11488782.html假设......
  • VMware vSphere 8.0 Update 2b 下载 - Broadcom VMware 首次重大更新
    VMwarevSphere8.0Update2b下载-BroadcomVMware首次重大更新VMwarevSphere8.0Update2b下载-企业级工作负载平台2月29日(北京时间3月1日),VMwarebyBroadcom停更5个月后,终于发布了首次重大更新!ESXi8.0U2&vCenterServer8.0U2请访问原文链接:https:......
  • av_packet_rescale_ts
    /***Convertvalidtimingfields(timestamps/durations)inapacketfromone*timebasetoanother.Timestampswithunknownvalues(AV_NOPTS_VALUE)willbe*ignored.**@parampktpacketonwhichtheconversionwillbeperformed*@paramsrc_tb......