C# GDI+绘图介绍

最近查阅网上资料,将GDI+的基本知识汇总如下:

一、基本的知识

GDI+:Graphics Device Interface Plus也就是图形设备接口,提供了各种丰富的图形图像处理功能;

在C#.NET中,使用GDI+处理二维(2D)的图形和图像,使用DirectX处理三维(3D)的图形图像,

图形图像处理用到的主要命名空间是System.Drawing,程序集:System.Drawing.d11:提供了对GDI+基本图形功能的访问,主要有Graphics类、Bitmap类、从Brush类继承的类、Font类、Icon类、Image类、Pen类、Color类等.

1.1Graphics类

俗称:画布,用于在其上面绘制相应的图像、图片、文字等内容...有以下三种创建方式

(1)利用窗体或控件的Paint事件的参数PaintEventArgs创建Graphics对象。

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.
        }

(2)使用窗体或控件的CreateGraphics方法

       Graphics  g=this.CreateGraphics();

       Graphics  g=this.button1.CreateGraphics();

(3)使用Image的派生类创建Graphics对象。使用Image的任何派生类均可以生成相应的Graphics对象,这种方法一般适用于在C#中对图像进行处理的场合。

       Bitmap b=new Bitmap("Mybmp.bmp");

       Graphics g=Graphics.FromImage(b);

1.2 Pen对象

Pen类的构造函数有四种,使用方法如下。

(1)创建某一颜色的Pen对象:public Pen(Color)

(2)创建某一刷子样式的Pen对象:public Pen(Brush)

(3)创建某—刷子样式并具有相应宽度的Pen对象:public Pen(Brush,float)

(4)创建某一颜色和相应宽度的Pen对象:public Pen(Color,float)

Pen对象的常用属性

(1)Alignment属性:用来获取或设置此Pen对象的对齐方式。

(2)Color属性:用来获取或设置此Pen对象的颜色。

(3)Width属性:用来获取或设置此Pen对象的宽度。

(4)DashStyle属性:用来获取或设置通过此Pen对象绘制的虚线的样式。

(5)DashCap属性:用来指定虚线两端风格,是一个DashCap枚举型的值。

(6)StartCap属性:用来获取或设置通过此Pen对象绘制的直线起点的帽样式。

(7)EndCap属性:用来获取或设置通过此Pen对象绘制的直线终点的帽样式。

(8)PenType属性:用来获取用此Pen对象绘制的直线的样式。 

private void Form1_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.Pen p = new Pen(Color.Blue, 2);//定义了一个蓝色,宽度为的画笔g.DrawLine(p, 10, 10, 100, 100);//在画板上画直线,起始坐标为(10,10),终点坐标为(100,100)g.DrawRectangle(p, 10, 10, 100, 100);//在画板上画矩形,起始坐标为(10,10),宽为,高为g.DrawEllipse(p, 10, 10, 100, 100);//在画板上画椭圆,起始坐标为(10,10),外接矩形的宽为,高为}

1.3Brush类的使用

作用:我们可以用画刷填充各种图形形状,如矩形、椭圆、扇形、多边形和封闭路径等,主要有几种不同类型的画刷:

 SolidBrush:画刷最简单的形式,用纯色进行绘制

•         HatchBrush:类似于 SolidBrush,但是可以利用该类从大量预设的图案中选择绘制时要使用的图案,而不是纯色

•         TextureBrush:使用纹理(如图像)进行绘制

•         LinearGradientBrush:使用沿渐变混合的两种颜色进行绘制

•         PathGradientBrush :基于编程者定义的唯一路径,使用复杂的混合色渐变进行绘制

以下是一段实例的代码

Graphics g = this.CreateGraphics();
Rectangle rect = new Rectangle(10, 10, 50, 50);//定义矩形,参数为起点横纵坐标以及其长和宽//单色填充
SolidBrush b1 = new SolidBrush(Color.Blue);//定义单色画刷          
g.FillRectangle(b1, rect);//填充这个矩形//字符串
g.DrawString("字符串", new Font("宋体", 10), b1, new PointF(90, 10));//用图片填充
TextureBrush b2 = new TextureBrush(Image.FromFile(@"e:\picture\1.jpg"));
rect.Location = new Point(10, 70);//更改这个矩形的起点坐标
rect.Width = 200;//更改这个矩形的宽来
rect.Height = 200;//更改这个矩形的高
g.FillRectangle(b2, rect);//用渐变色填充
rect.Location = new Point(10, 290);
LinearGradientBrush b3 = new  LinearGradientBrush(rect, Color.Yellow , Color.Black , LinearGradientMode.Horizontal);
g.FillRectangle(b3, rect);

二、其他知识点

2.1坐标轴的转化

在winform中的坐标轴和我们平时接触的平面直角坐标轴不同,winform中的坐标轴方向完全相反:窗体的左上角为原点(0,0),水平向左则X增大,垂直下向则Y增大

 

 

Graphics g = this.CreateGraphics();//单色填充
//SolidBrush b1 = new SolidBrush(Color.Blue);//定义单色画刷          
Pen p = new Pen(Color.Blue,1);//转变坐标轴角度
for (int i = 0; i < 90; i++)
{ g.RotateTransform(i);//每旋转一度就画一条线g.DrawLine(p, 0, 0, 100, 0);g.ResetTransform();//恢复坐标轴坐标
}//平移坐标轴
g.TranslateTransform(100, 100);
g.DrawLine(p, 0, 0, 100, 0);
g.ResetTransform();//先平移到指定坐标,然后进行度旋转
g.TranslateTransform(100,200);
for (int i = 0; i < 8; i++)
{
g.RotateTransform(45);
g.DrawLine(p, 0, 0, 100, 0);
}g.Dispose();

  2.2附加一段仿QQ截图形式的一种截图形式

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace Client
{public partial class Catch : Form{public Catch(){InitializeComponent();}#region 用户变量private Point DownPoint = Point.Empty;//记录鼠标按下坐标,用来确定绘图起点private bool CatchFinished = false;//用来表示是否截图完成private bool CatchStart = false;//表示截图开始private Bitmap originBmp;//用来保存原始图像private Rectangle CatchRect;//用来保存截图的矩形#endregion//窗体初始化操作private void Catch_Load(object sender, EventArgs e){this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);this.UpdateStyles();//以上两句是为了设置控件样式为双缓冲,这可以有效减少图片闪烁的问题,关于这个大家可以自己去搜索下originBmp = new Bitmap(this.BackgroundImage);//BackgroundImage为全屏图片,我们另用变量来保存全屏图片}//鼠标右键点击结束截图private void Catch_MouseClick(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Right){this.DialogResult = DialogResult.OK;this.Close();}}//鼠标左键按下时动作private void Catch_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){if (!CatchStart){//如果捕捉没有开始CatchStart = true;DownPoint = new Point(e.X, e.Y);//保存鼠标按下坐标}}}private void Catch_MouseMove(object sender, MouseEventArgs e){if (CatchStart){//如果捕捉开始Bitmap destBmp = (Bitmap)originBmp.Clone();//新建一个图片对象,并让它与原始图片相同Point newPoint = new Point(DownPoint.X, DownPoint.Y);//获取鼠标的坐标Graphics g = Graphics.FromImage(destBmp);//在刚才新建的图片上新建一个画板Pen p = new Pen(Color.Blue,1);int width = Math.Abs(e.X - DownPoint.X), height = Math.Abs(e.Y - DownPoint.Y);//获取矩形的长和宽if (e.X < DownPoint.X){newPoint.X = e.X;}if (e.Y < DownPoint.Y){newPoint.Y = e.Y;}CatchRect = new Rectangle(newPoint,new Size(width,height));//保存矩形g.DrawRectangle(p,CatchRect);//将矩形画在这个画板上g.Dispose();//释放目前的这个画板p.Dispose();Graphics g1 = this.CreateGraphics();//重新新建一个Graphics类//如果之前那个画板不释放,而直接g=this.CreateGraphics()这样的话无法释放掉第一次创建的g,因为只是把地址转到新的g了.如同string一样g1 = this.CreateGraphics();//在整个全屏窗体上新建画板g1.DrawImage(destBmp,new Point(0,0));//将刚才所画的图片画到这个窗体上//这个也可以属于二次缓冲技术,如果直接将矩形画在窗体上,会造成图片抖动并且会有无数个矩形.g1.Dispose();destBmp.Dispose();//要及时释放,不然内存将会被大量消耗}}private void Catch_MouseUp(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){if (CatchStart){CatchStart = false;CatchFinished = true;}}}//鼠标双击事件,如果鼠标位于矩形内,则将矩形内的图片保存到剪贴板中private void Catch_MouseDoubleClick(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left&&CatchFinished){if (CatchRect.Contains(new Point(e.X, e.Y))){Bitmap CatchedBmp = new Bitmap(CatchRect.Width, CatchRect.Height);//新建一个于矩形等大的空白图片Graphics g = Graphics.FromImage(CatchedBmp);g.DrawImage(originBmp, new Rectangle(0, 0, CatchRect.Width, CatchRect.Height), CatchRect, GraphicsUnit.Pixel);//把orginBmp中的指定部分按照指定大小画在画板上Clipboard.SetImage(CatchedBmp);//将图片保存到剪贴板g.Dispose();CatchFinished = false;this.BackgroundImage = originBmp;CatchedBmp.Dispose();this.DialogResult = DialogResult.OK;this.Close();}}}}
}C.创建了Catch窗体后,我们在截图按钮(位于聊天窗体上)上加入以下事件:private void bCatch_Click(object sender, EventArgs e){if (bCatch_HideCurrent.Checked){this.Hide();//隐藏当前窗体Thread.Sleep(50);//让线程睡眠一段时间,窗体消失需要一点时间Catch CatchForm = new Catch();Bitmap CatchBmp = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);//新建一个和屏幕大小相同的图片         Graphics g = Graphics.FromImage(CatchBmp);g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height));//保存全屏图片CatchForm.BackgroundImage = CatchBmp;//将Catch窗体的背景设为全屏时的图片if (CatchForm.ShowDialog() == DialogResult.OK){//如果Catch窗体结束,就将剪贴板中的图片放到信息发送框中IDataObject iData = Clipboard.GetDataObject();DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Bitmap);if (iData.GetDataPresent(DataFormats.Bitmap)){richtextbox1.Paste(myFormat);Clipboard.Clear();//清除剪贴板中的对象}this.Show();//重新显示窗体}}}

  

转载于:https://www.cnblogs.com/liuxiaowei0543/p/3683976.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

统计学第二章--感知机

感知机是一种较为简单的二分类模型&#xff0c;感知机旨在学习能够将输入数据划分为1/-1的线性分离超平面&#xff0c;所以说整体而言感知机是一种线性模型。 查看数据集 import pandas as pd import numpy as np from sklearn.datasets import load_iris import matplotlib.…

你坐飞机时可能意识不到,AI已经全流程为你保驾护航

作者 &#xff1a;Alyson Behr编译&#xff1a;机器之能 高璇、微胖摘要&#xff1a;AI在航空领域的应用比你目前所知的还要丰富。除了自动驾驶&#xff0c;从驾驶舱到后勤部门乃至客户体验&#xff0c;对于AI应用的探索几乎遍及整个行业。当「人工智能」和航空业结合在一起时…

pytorch基础知识+构建LeNet对Cifar10进行训练+PyTorch-OpCounter统计模型大小和参数量+模型存储与调用

整个环境的配置请参考我另一篇博客。ubuntu安装python3.5pycharmanacondaopencvdockernvidia-dockertensorflowpytorchCmake3.8_智障变智能-CSDN博客 中文文档:torch - PyTorch中文文档 github简单示例&#xff1a;多卡分布式教程&#xff0c;带有多卡mnist分布式训练和单卡训…

量子计算

来源&#xff1a;博客丨政策管理作者&#xff1a;贺飞&#xff08;北京大学&#xff09;摘要&#xff1a;量子计算&#xff1a;前途光明 道路曲折量子计算&#xff1a;前途光明 道路曲折&#xff08;一&#xff09;本周&#xff0c;美国国家科学院、工程院和医学院的一个由13…

深度学习可视化的一些工具+pytorch实现回归与卷积可视化

一.深度学习可视化的一些工具 1.深度学习网络结构画图工具:https://cbovar.github.io/ConvNetDraw/ 2.将.onnx放入即可,可视化网络结构:https://lutzroeder.github.io/netron/ 3.结构可视化工具:https://github.com/HarisIqbal88/PlotNeuralNet 二.回归 线性回归的损失函数…

《人工智能转型手册》,吴恩达 著

来源&#xff1a;量子位AI大者&#xff0c;为国为民。从今往后&#xff0c;市值5亿美元至5000亿美元的企业&#xff0c;都能用得上、用得会、用得好吴恩达的AI转型经验了。这是他在谷歌和百度带队AI的核心总结&#xff0c;也是他见得广、听得多、被咨询无数后的精华提炼。一册《…

Android Studio开发入门-引用jar及so文件

作者&#xff1a;王先荣 最近初学安卓开发&#xff0c;因为以前从未用过JAVA&#xff0c;连基本的语法都要从头开始&#xff0c;所以不太顺利。在尝试使用百度语音识别引擎时遇到了如何引用jar及so文件的问题。在GOOGLE加多次尝试之后&#xff0c;找到了一个比较简单的方法&…

腾讯杰出科学家写给2029的信:计算机视觉AI技术的爆点在哪里?

文 |腾讯杰出科学家、腾讯优图实验室负责人 贾佳亚 腾讯优图实验室总监 戴宇荣博士 郑冶枫博士近年来&#xff0c;计算机视觉AI技术发展迅速&#xff0c;尤其是人工智能的引入大大提升了算法的能力和实用性。在数不清的视觉AI应用中&#xff0c;我们认为未来技术的爆发点可能来…

pytorch实现Dropout与正则化防止过拟合

numpy实现dropout与L1,L2正则化请参考我另一篇博客 https://blog.csdn.net/fanzonghao/article/details/81079757 pytorch使用dropout与L2 import torch import matplotlib.pyplot as plt torch.manual_seed(1) # Sets the seed for generating random numbers.reproduc…

“蚁人”不再是科幻!MIT最新研究,能把任何材料物体缩小1000倍 | Science

来源&#xff1a;量子位科学加速&#xff0c;科幻成真也在加速。漫威世界中&#xff0c;蚁人是蚂蚁大小的超级英雄&#xff0c;靠一件“变身服”&#xff0c;人类就能在更微观的世界里大干一场。现在&#xff0c;类似的科幻想象&#xff0c;被MIT变成现实。丨小小小&#xff0c…

Android ARM指令学习

在逆向分析Android APK的时候&#xff0c;往往需要分析它的.so文件。这个.so文件就是Linux的动态链接库&#xff0c;只不过是在ARM-cpu下编译的。所以学习Android下的ARM指令很重要。目前&#xff0c;市面上的ARM-cpu基本都支持一种叫做THUMB的指令集模式。这个THUMB指令集可以…

cuda基础知识

nvidia-cuda 手册:https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#kernels nvidia cuda 教学视频 https://www.nvidia.cn/object/cuda_education_cn_old.html 介绍: CUDA编程模型是一个异构模型&#xff0c;需要CPU和GPU协同工作。在CUDA中&#xff0c;…

苹果着手自研调制解调器,以应对高通天价专利费

来源&#xff1a;DeepTech深科技近日&#xff0c;苹果官方发布一份招聘信息&#xff0c;其中有一个职位就非常惹人注意&#xff0c;根据信息&#xff0c;苹果准备招募两名蜂窝调制解调器系统架构师&#xff0c;一名构架师的工作地点在圣克拉拉&#xff0c;另一名构架师的工作地…

labelme标注文件转coco json,coco json转yolo txt格式,coco json转xml, labelme标注文件转分割,boxes转labelme json

参考&#xff1a;https://github.com/wkentaro/labelme 一.labelme标注文件转coco json 1.标注时带图片ImageData信息&#xff0c;将一个文件夹下的照片和labelme的标注文件&#xff0c;分成了train和val的coco json文件和照片&#xff0c; (COCO的格式&#xff1a; [x1,y1,…

“深度学习之父”大谈AI:寒冬不会出现,论文评审机制有损创新

来源&#xff1a; AI科技大本营整理&#xff1a;琥珀近日《连线》杂志发表了一篇文章&#xff0c;记录了与“深度学习之父” Geoffrey Hinton 围绕人工智能伦理、技术、学术等领域的采访实录。当被问到如今人工智能是否将走进寒冬时&#xff0c;Hinton 的回答非常坚决&#xff…

GDataXML解析XML文档

一、GDataXMLNode说明GDataXMLNode是Google提供的用于XML数据处理的类集。该类集对libxml2--DOM处理方式进行了封装&#xff0c;能对较小或中等的xml文档进行读写操作且支持XPath语法。 使用方法&#xff1a;1、获取GDataXMLNode.h/m文件&#xff0c;将GDataXMLNode.h/m文件添加…

RetinaNet+focal loss

one stage 精度不高&#xff0c;一个主要原因是正负样本的不平衡&#xff0c;以YOLO为例&#xff0c;每个grid cell有5个预测&#xff0c;本来正负样本的数量就有差距&#xff0c;再相当于进行5倍放大后&#xff0c;这种数量上的差异更会被放大。 文中提出新的分类损失函数Foca…

真实用户首次披露Waymo无人车服务体验: 为避开左转, 故意绕路

来源 &#xff1a;Ars Technica编译 &#xff1a;机器之能 高璇外国网友炸了&#xff1a;「就像看了一部大导演导的烂片一样。」在过去的 18 个月里&#xff0c;Waymo 的汽车一直在凤凰城的东南角运送乘客。该公司在合同中明确规定禁止乘客讨论用户体验&#xff0c;对项目信息进…

“横平竖直”进行连线+将相邻框进行合并

一.横平竖直”进行连线 解法1.将一些坐标点按照x相等,y相等连起来 解法1.根据 x或y总有一个相等的,用np.sum来找出和为1的点,然后在连起来,存在重复连线的问题. import numpy as npcoord np.array([[10, 60],[10, 20],[20, 20],[40, 40],[40, 60],[20, 40]])img np.zeros(…

一文看透汽车芯片!巨头布局技术路线全解密【附下载】| 智东西内参

来源&#xff1a;智东西摘要&#xff1a;一文看透汽车芯片&#xff01;巨头布局技术路线全解密智能驾驶涉及人机交互、视觉处理、智能决策等&#xff0c;核心是 AI 算法和芯片。伴随汽车电子化提速&#xff0c;汽车半导体加速成长&#xff0c;2017 年全球市场规模 288 亿美元&a…