C# GDI+ 绘图

2023-10-26

1 坐标系统

(1) 坐标原点:在窗体或控件的左上角,坐标为(0,0)

(2) 正方向:X轴正方向为水平向右,Y轴正方向为竖直向下

(3) 单位:在设置时,一般以像素为单位,像素(Pixel)是由图像(Picture)和元素(Element)组成,是用来计算数码影像的一种单位。

把影像放大数倍,会发现这些连续的色调其实是有许多色彩相近的小方点组成,这些小方点是构成影像的最小单位—像素。

图形的质量是有像素决定,像素越大,分辨率也越大。

2 命名空间 --- System.Drawing

(1) System.Drawing 提供了对GDI+基本图形功能的访问

(2)  System.Drawing 常用基本类及结构

说明

Bitmap

用于处理有像素数据定义的图像的对象。

Brush

定义用于填充图形形状的内部对象。

Font

定义特定的文本格式。

Graphics

封装一个GDI+绘图图画,无法继承此类。

Pen

用于绘制直线和曲线的对象,无法继承此类。

Region

指示由矩形和路径构成的图形形状的内部,无法继承此类。

Color

表示RGB颜色。

Point

定义二维平面中定义的点。

Rectangle

存储一组整数,共4个,表示一个矩形的位置和大小。

Size

存储一个有序整数对,通常为矩形的宽和高。

3 Graphics类

Graphics类封装了一个GDI+绘制界面,提供将对象绘制到显示界面的方法。使用GDI+创建图形图像时,需要先创建Graphics对象,即在哪里画图。

共有3种类型的绘图界面:

(1)   窗体和控件

(2)   打印机

(3)   内存的位图

创建图形对象的3中方法:

(1)控件类的OnPaint()方法参数PaintEventArgs获取Graphics对象

(2)窗体类或控件类中的CreateGraphics()方法获得Graphics对象

(3)从位图对象(Bitmap)产生一个Graphics对象

Graphics类的常用方法

名称

说明

Dispose

释放Graphics使用的所有资源。

DrawEllipse

绘制椭圆,有高度,宽度,一对坐标。

DrawArc

绘制弧形。

DrawLine

绘制一条直线,由2个点指定。

DrawPolygon

绘制由一组Point结构定义的多边形。

DrawRectangle

绘制矩形。

DrawPie

绘制一个扇形。

DrawCurse

绘制曲线,由参数Point数组指定。

FillEllipse

填充边框所定义的椭圆的内部。

FillRegion

填充Region的内部。

ScaleTransform

将制定的缩放操作应用于次Graphics。

TanslateTransform

平移更改坐标系统的原点。

4 绘图工具类

类名

说明

Pen

设置画笔的颜色,线条粗细和线条样式(实线和虚线)。

Brush

用于填充图形,设置笔刷的样式,颜色及线条的粗细。

5 Brush类的派生类

名称

说明

ImageBrush

图像绘制区域。

LinearGradientBrush

线性渐变绘制区域。

RadialGradientBrush

径向渐变绘制区域,焦点定义渐变的开始,椭圆定义渐变的终点。

SolidColorBrush

单色绘制区域。

VideoBrush

视频内容绘制区域。

6 案例  免费下载地址 http://download.csdn.net/detail/taoerit/8350869


7  代码

[csharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using System.Drawing.Drawing2D;  
  10.   
  11.   
  12. namespace GDI绘图  
  13. {  
  14.     public partial class MainDialog : Form  
  15.     {  
  16.         public MainDialog()  
  17.         {  
  18.             InitializeComponent();  
  19.         }  
  20.   
  21.         private void MainDialog_Load(object sender, EventArgs e)  
  22.         {  
  23.   
  24.         }  
  25.   
  26.         private void lineButton_Click(object sender, EventArgs e)  
  27.         {  
  28.             // 画直线  
  29.             Graphics gra = this.CreateGraphics();  
  30.             Pen pen = new Pen(Color.Red);  
  31.             pen.Width = 2;  
  32.             Point startPoint = new Point(20,20);  
  33.             Point endPoint = new Point(70,20);  
  34.             gra.DrawLine(pen,startPoint,endPoint);  
  35.               
  36.             pen.Dispose();  
  37.             gra.Dispose();  
  38.         }  
  39.   
  40.         private void rectangleButton_Click(object sender, EventArgs e)  
  41.         {  
  42.             //画矩形  
  43.             Graphics gra = this.CreateGraphics();  
  44.             Pen pen = new Pen(Color.Red);  
  45.             gra.DrawRectangle(pen, 20,50, 100,100);  
  46.             pen.Dispose();  
  47.             gra.Dispose();  
  48.         }  
  49.         private void cyliderButton_Click(object sender, EventArgs e)  
  50.         {  
  51.             //圆柱体,有许多个椭圆有底部逐渐叠起来的,最后填充颜色  
  52.   
  53.             int height = this.ClientSize.Height - 150;  
  54.             int width = this.ClientSize.Width - 50;  
  55.             int vHeight = 200;  
  56.             int vWidth = 100;  
  57.             Graphics gra = this.CreateGraphics();  
  58.             gra.Clear(Color.White);  
  59.             Pen pen = new Pen(Color.Gray,2);  
  60.             SolidBrush brush = new SolidBrush(Color.Gainsboro);  
  61.   
  62.             for (int i = height / 2; i > 0;i-- )  
  63.             {  
  64.                 gra.DrawEllipse(pen,width/2,i,vHeight,vWidth);  
  65.             }  
  66.   
  67.             gra.FillEllipse(brush,width/2,0,vHeight,vWidth);  
  68.         }  
  69.   
  70.         private void fillRectangleButton_Click(object sender, EventArgs e)  
  71.         {  
  72.             //画矩形  
  73.             Graphics gra = this.CreateGraphics();  
  74.             Pen pen = new Pen(Color.Red,3);  
  75.             Brush brush = pen.Brush;  
  76.             Rectangle rect = new Rectangle(20,50,100,100);  
  77.             gra.FillRectangle(brush,rect);  
  78.             gra.Dispose();  
  79.         }  
  80.   
  81.         private void drawEllispeButton_Click(object sender, EventArgs e)  
  82.         {  
  83.             Graphics gra = this.CreateGraphics();  
  84.             Rectangle rect = new Rectangle(0,0,200,100);  
  85.             LinearGradientBrush brush = new LinearGradientBrush(rect,Color.Orange,Color.Purple,90);  
  86.             gra.FillEllipse(brush,rect);  
  87.             gra.Dispose();  
  88.         }  
  89.   
  90.         private void fontButton_Click(object sender, EventArgs e)  
  91.         {  
  92.             Graphics gra = this.CreateGraphics();  
  93.             Font font = new Font("隶书",24,FontStyle.Italic);  
  94.             Pen pen = new Pen(Color.Blue,3);  
  95.             gra.DrawString("Windows应用程序设计",font,pen.Brush,10,100);  
  96.         }  
  97.   
  98.         private void ellispeButton_Click(object sender, EventArgs e)  
  99.         {  
  100.             // 画圆形  
  101.             Graphics gra = this.CreateGraphics();  
  102.             Pen pen = new Pen(Color.Red);  
  103.             gra.DrawEllipse(pen, 0, 0, 200,100);  
  104.             pen.Dispose();  
  105.             gra.Dispose();  
  106.         }  
  107.   
  108.         private void moveEllispeButton_Click(object sender, EventArgs e)  
  109.         {  
  110.             // 移动圆形  
  111.             Graphics gra = this.CreateGraphics();  
  112.             Pen pen = new Pen(Color.Red);  
  113.             gra.TranslateTransform(10,10);// 改变起坐标(10,10)  
  114.             gra.DrawEllipse(pen, 0, 0, 200, 100);  
  115.   
  116.             gra.Dispose();  
  117.         }  
  118.   
  119.         private void scaleEllispeButton_Click(object sender, EventArgs e)  
  120.         {  
  121.             // 缩放圆形  
  122.             float xScale = 1.5F;  
  123.             float yScale = 2F;  
  124.             Graphics gra = this.CreateGraphics();  
  125.             Pen pen = new Pen(Color.Red);  
  126.             gra.ScaleTransform(xScale, yScale);// X轴放大1.5倍, Y轴放大2倍  
  127.             gra.DrawEllipse(pen, 0, 0, 200, 100);  
  128.             gra.Dispose();  
  129.         }  
  130.   
  131.         private void curveButton_Click(object sender, EventArgs e)  
  132.         {  
  133.             //绘制曲线  
  134.             Graphics gra = this.CreateGraphics();  
  135.             Pen pen = new Pen(Color.Blue,3);  
  136.             Point oo1 = new Point(30,this.ClientSize.Height -100);  
  137.             Point oo2 = new Point(this.ClientSize.Width - 50 ,this.ClientSize.Height - 100);  
  138.             gra.DrawLine(pen,oo1,oo2);  
  139.             Point oo3 = new Point(30, 30);  
  140.             gra.DrawLine(pen, oo1, oo3);  
  141.             Font font = new System.Drawing.Font("宋体",12,FontStyle.Bold);  
  142.             gra.DrawString("X",font,pen.Brush,oo2);  
  143.             gra.DrawString("Y", font,pen.Brush,10,10);  
  144.   
  145.             int x1 = 0, x2 = 0;  
  146.             double a = 0;  
  147.             double y1 = 0, y2 = this.ClientSize.Height - 100;  
  148.             for (x2 = 0; x2 < this.ClientSize.Width;x2++ )  
  149.             {  
  150.                 a = 2 * Math.PI * x2 / (this.ClientSize.Width);  
  151.                 y2 = Math.Sin(a);  
  152.                 y2 = (1 - y2) *(this.ClientSize.Height-100)/2;  
  153.                 gra.DrawLine(pen,x1 +30,(float)y1 ,x2+30,(float)y2);  
  154.                 x1 = x2;  
  155.                 y1 = y2;  
  156.             }  
  157.             gra.Dispose();  
  158.         }  
  159.   
  160.         private void piechartButton_Click(object sender, EventArgs e)  
  161.         {  
  162.             //饼图  
  163.             Graphics gra = this.CreateGraphics();  
  164.             Pen pen = new Pen(Color.Blue, 3);  
  165.             Rectangle rect = new Rectangle(50,50,200,100);  
  166.             Brush brush = new SolidBrush(Color.Blue);  
  167.             gra.FillPie(pen.Brush,rect,0,60);  
  168.             gra.FillPie(brush,rect,60,150);  
  169.             brush = new SolidBrush(Color.Yellow);  
  170.             gra.FillPie(brush,rect,210,150);  
  171.   
  172.         }  
  173.   
  174.     }  
  175. }  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# GDI+ 绘图 的相关文章

  • 计算机程序的思维逻辑 (12) - 函数调用的基本原理

    栈 上节我们介绍了函数的基本概念 在最后我们提到了一个系统异常java lang StackOverflowError 栈溢出错误 要理解这个错误 我们需要理解函数调用的实现机制 本节就从概念模型的角度谈谈它的基本原理 我们之前谈过程序执行
  • C#连接sqlServer数据库详解

    C 是如何跟SQL Server进行连接的 在C NET程序设计中 离不开ADO NET ADO NET是 NET连接数据库的重要组件 使用其可以很方便地访问数据库 ADO NET还可以访问Oracle数据库 Access数据库 SQL S
  • C# GDI+ 绘图

    1 坐标系统 1 坐标原点 在窗体或控件的左上角 坐标为 0 0 2 正方向 X轴正方向为水平向右 Y轴正方向为竖直向下 3 单位 在设置时 一般以像素为单位 像素 Pixel 是由图像 Picture 和元素 Element 组成 是用来
  • Unity UI或3d模型的动画控制(Animation类)

    文章目录 Animation动画控制类 一 动画设置 二 模型的动作选择 三 关键方法 四 实践展示 五 控制模型移动 Animation动画控制类 在Unity中 我们可以使用2D的Spine动画来制作核心战斗模块 当然也能用3D模型来制
  • 图片自适应屏幕大小的css写法

    如果想让图片自适应屏幕的小而不是宽高固定不变可以在css代码里加入 img height auto width auto 9 width 100 用max width设置如果图片尺寸大于当前浏览器尺寸就自动缩放 图片的高度设置正比缩放 但是
  • 未来几年学什么设计更有前途?

    设计 是把一种设想通过合理的规划 周密的计划 通过各种感觉形式传达出来的过程 是设计师有目标有计划的进行技术性的创作与创意活动 设计的任务不只是为生活和商业服务 同时也伴有艺术性的创作 它是一个很大范围的概念 如果单问未来几年学什么设计更有
  • Qt开发之QTableWidget

    QTableWidget从继承QTableView 实质属于模型 视图范畴之内 只是带了默认模型 model 基于项目 item 的表格视图控件 我们不需要实现model内的数据加工 QTableWidget为应用程序提供了标准的表显示工具
  • 【开发工具】 windows10使用adobe傻瓜式教程 真的太爽了吧!!

    个人主页 极客小俊 作者简介 web开发者 设计师 技术分享博主 希望大家多多支持一下 我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 其中包含了 你懂的 我不说啦 系统与硬件需求 操作系统 软件版本越高 对电脑系统要求
  • 抖音设计系统Semi Design:解构、原理与实现

    摘要 本文将深入探讨抖音设计系统Semi Design 阐述其定义 分析其原理 并通过详细代码展示其实现方法 本文旨在为设计师 开发人员和相关领域的研究者提供有关Semi Design的深入理解和实用指南 引言 抖音 作为一款全球流行的短视
  • 空间配置器(allocator)详解-stl源码剖析学习笔记

    一 什么是空间配置器 空间配置器也就是配置空间 配置容器所需要的空间 该空间获取可以是内存 也可以是磁盘或其他存储介质 二 STL规范必要接口 stl有很多实现版本 根据stl规范 allocator的必要接口如下 类型型别 设计缘由后续章
  • C++中对象的动态建立与释放详解

    我们知道可以用new运算符可以动态的分配内存 用delete运算符可以释放这些内存 当我们使用new运算符动态的分配一个内存之后 会自动返回一个该内存段的起始地址 也就是指针 下面先给出一个new和delete基本应用的例子 回顾一下它的基
  • C++中对象创建与释放

    创建对象有以下四种形式 include
  • c#中代码中多线程动态创建progressbar的实例,概念很重要可扩展很多类似概念

    以下是代码中创建progressbar的实例 int count 0 private void button4 Click object sender EventArgs e Thread th new Thread gt Form for
  • qt creator各个部件显示图片总结

    在工作中 UI设计经常需要显示各式各样的图片 下面就总结了qt如何在一些部件中显示图片的方式 一 QFrame或者QWidget显示图片 在属性stylesheet中填写 loginBoxFrame border image url ico
  • mutable和volatile

    mutable变量永远处于可变的状态 mutable在类中只能修饰非静态数据成员 即使是在const函数中 甚至是const结构体变量或类对象 其mutable成员也可以被修改 我们知道 如果类的成员函数不会改变对象的状态 那么这个成员函数
  • 推荐几个UI/UX设计师常用软件和网站

    网站 Dribbble dribbble com Dribble是一个面向创作家 艺术工作者 设计师等创意类作品的人群 提供作品在线服务 供网友在线查看已经完成的作品或者正在创作的作品的交流网站 Dribbble还针对手机推出了相应的软件
  • 现在学UI设计有前途吗?UI设计收入大概多少

    随着互联网的高速发展以及大量的人奔涌进入UI设计行业 我们发现想要通过UI实现高薪就业变得不再容易 这让很多人担忧 现在学UI设计还有前途吗 千锋郑州UI设计老师从市场需求 就业薪资以及职业发展方向三个角度分析后可以负责的告诉你有前途 UI
  • 如何把一张照片用PS做成漫画风格

    如何把一张照片用PS做成漫画风格 原素材 漫画天空 1 打开ps 打开素材 然后按住ctrl j 复制一个图层 并修改好名字 如下图操作 2 执行 滤镜 滤镜库 干画笔 如图所示 三个参数分别是 0 10 2 3 执行 滤镜 Camera
  • 优秀LOGO的六大特质

    1 识别性 大多数的设计师认为 识别性是最容易在艺术设计和商业设计上发生冲突的地方 很多设计师都抱怨客户没有审美 喜欢平庸的LOGO设计 而一些客户认为设计师缺乏对公司和产品的理解 不懂营销 归根到底 无论设计师的设计多么创新 多么独特 始
  • VS项目属性的一些配置项的总结(important)

    以下内容为 原创 转载 首先 解决方案和项目文件夹包含关系 c 项目 VS解决方案和各个项目文件夹以及解决方案和各个项目对应的配置文件包含关系 假设新建一个项目ssyy 解决方案起名fangan 注意解决方案包括项目 此时生成的最外层目录为

随机推荐

  • WPF绘制图形

    利用WPF绘制简单图形 就像Winform那样 参考DrawToolsWPF using System using System Collections Generic using System Linq using System Text
  • 浏览器 hard refresh

    浏览器 hard referesh force refresh 不同于普通的按 F5 键刷新页面 它会先清当前页面的 cache 然后再刷新页面 这比手工找在浏览器设置中清当前站点的 cache 要方便的多 方法 Windows Ctrl
  • 【Java项目】多文件传输:文件分割与传输

    所谓的文件分割 并非真的将文件切割多个块存储发送 实质上是 用尺子和笔给整个文件块做上分割标记 那么发送时 文件的随机读写 可根据这些标记小块发送 接收端 也可以根据分割信息进行清点与组装 发送端与接收端只要约定好发送与接收 即传输协议 就
  • 算法可视化

    软件功能 以数组为例 一个数组是一个容器 对其进行可视化 主要针对数组的值查找 指定位置插入 指定位置删除进行可视化 软件针对每个数据结构可视化分两个方面 教学模式 主要针对数据结构每个方面进行讲解 可动画演示 实践模式 允许使用者自己通过
  • 汇编语言(王爽第三版)实验三

    实验三 题目预览 将下面的程序保存为t1 asm文件 将其生成可执行t1 exe 用Debug跟踪t1 exe的执行过程 写出每一步执行后 相关寄存器中的内容和栈顶的内容 PSP的头两个字节是CD20 用Debug加载t1 exe 查看PS
  • python3编码格式_python3编码方式

    ascii A 00000001 8位 1个字节 unicode A 00000000 00000000 00000000 00000001 32位 4个字节 utf 8 A 0000 0010 8位 1个字节 中文 00000000 00
  • 数据挖掘:认识数据

    越来越多的人认识到 数据对这个世界的影响越来越大 掌握数据就掌握了发言权 如何从数据中找到想要的知识 是得到数据之后最需要关心的 数据挖掘 也是知识发现的过程 1 理解数据 现实世界中 各行各业每时每刻都在产生数量庞大的数据集 让人眼花缭乱
  • 怎样才能跳过实名认证_和平精英qq怎么跳过实名认证!老司机告诉你仅需5步

    qq怎么跳过实名认证玩家是否知晓 虽然来说跳过实名认证对于手游来说并没有什么帮助 但是这个方式方法玩家还是需要知道的 这样能够帮助玩家轻松的做到某些事情 而这里就是样式玩家如何进行和平精英实名认证怎么跳过 其实在老司机手机仅需5步即可 和平
  • gtx1660是什么级别的_显卡天梯图秒懂GTX1660Ti性能 GTX1660Ti相当于什么显卡

    GTX1660Ti是NVIDIA二月份刚发布的一款显卡 从命名上看 它是历代英伟达显卡中 最 6 的显卡 名称中包含了3个6字 作为上一代甜品级GTX1060的继任者 而颇受关注 那么GTX1660Ti相当于什么显卡 其大致性能是什么水平呢
  • 色值的封装方法以及RGB和RGBA的区别

    取色值相关的方法 define RGB r g b UIColor colorWithRed r 255 f green g 255 f blue b 255 f alpha 1 f define RGBA r g b a UIColor
  • 项目搭建之代码规范化解决方案

    代码规范化解决方案Eslint Prettier Eslint 是一个插件化的 javascript 代码检测工具 用于代码格式检测 不符合Eslint规则的代码 会被检测到发出警告 报错 通过 eslintrc js 文件可以进行自定义的
  • 约瑟夫环:循环链表,数组

    约瑟夫环 1 循环链表 设计思路 2 顺序表 数组实现 设计思路 站成一圈 从1报数 报数为m则出列 求出列序列 1 循环链表 设计思路 用循环链表实现逻辑结构 mermaid svg Ejge7i4yvNzv6PZ2 label font
  • Python opencv学习-5创建带调色板的画板

    test5 带调色板的画板 可改变线的粗细 颜色 缺点 其实是不断画圆 鼠标动作快了能看出执行间隔 import cv2 import numpy as np drawing False mouse callback function de
  • MATLAB回归分析--------2019/8/2

    回归分析 多元线性回归 Matlab 统计工具箱用命令 regress 实现多元线性回归 用的方法是最小二乘法 用 法是 b r e g r e
  • linux中摄像头旋转90度,ok335xD 如何将屏幕显示转90度在linux下,竖屏变横屏。

    我在内核里发现这样几个文件 不知是否能用的到 在drivers video 下 Kconfig and 8 15 or 16 bpp color 90 degrees clockwise display rotation for xilin
  • linux 日志查看

    Linux 查看日志相关命令总结 Linux日志筛选命令 常用Linux日志查看命令 grep常用用法 zgrep 不解压过滤压缩包中文本 Linux命令大全 手册 循环实时查看最后50行记录 tailf n 50 tomcat stdou
  • 在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)...

    最近 在论坛中 遇到了不少比较难的sql问题 虽然自己都能解决 但发现过几天后 就记不起来了 也忘记解决的方法了 所以 觉得有必要记录下来 这样以后再次碰到这类问题 也能从中获取解答的思路 问题 求SQL 检索某个节点下所有叶子节点 部门表
  • centos7配置yum为国内源

    问题 yum install libXm so 4 报错 Cannot find a valid baseurl for repo base 7 x86 64 因为yum源不是国内的 切换一下 步骤 卸载 yum rpm aq grep y
  • 字节青训营第十三课之深入浅出RPC框架的笔记与总结.md

    基本概念 本地函数调用 函数调用完整过程如图 藏实际上编译器经常优化 参数和返回值少时直接将其存在寄存器 不需操作栈 直接online不需call 将a和b的值入栈 经函数指针找到calculate 进入函数取栈中值2和3赋给x和y 计算x
  • C# GDI+ 绘图

    1 坐标系统 1 坐标原点 在窗体或控件的左上角 坐标为 0 0 2 正方向 X轴正方向为水平向右 Y轴正方向为竖直向下 3 单位 在设置时 一般以像素为单位 像素 Pixel 是由图像 Picture 和元素 Element 组成 是用来