C#中的Graphics类和SetQuality()自定义方法
在 C# 中,Graphics 类是 System.Drawing 命名空间的一部分,它提供了一组方法和属性,用于在 Windows Forms 应用程序中进行二维绘图。Graphics 对象可以绘制文本、线条、曲线、形状和图像,并可以对它们进行变换和剪辑。
Graphics 类的一些常用功能和方法:
1.绘制线条:
DrawLine(Pen pen, int x1, int y1, int x2, int y2):使用指定的 Pen 对象绘制直线。
DrawLines(Pen pen, Point[] points):使用指定的 Pen 对象和点数组绘制一系列连续的线条。
public Form1()
{InitializeComponent();this.panel1.Paint += Panel1_Paint;this.panel2.Paint += Panel2_Paint;
}
//DrawLine(Pen pen, int x1, int y1, int x2, int y2)
private void Panel1_Paint(object sender, PaintEventArgs e)
{//1.创建图形(画布,画板)Graphics g = e.Graphics;//2.设置绘制参数()SetQuality(g);//3.开始绘制Pen pen = new Pen(Color.Red, 10F);Point pt1 = new Point(50, 50);Point pt2 = new Point(100, 50);g.DrawLine(pen, pt1, pt2);//注意:起点的坐标,考虑画笔的宽度Pen pen1 = new Pen(Color.Blue, 10F);Point pt3 = new Point(100 + 5, 50 - 5);Point pt4 = new Point(100 + 5, 100);g.DrawLine(pen1, pt3, pt4);
}
//DrawLines(Pen pen, Point[] points)
private void Panel1_Paint(object sender, PaintEventArgs e)
{Pen pen = new Pen(Color.Red, 10F);Point[] points = new Point[]{new Point(80,150),new Point(80,20),new Point(20,100),new Point(120,100),};g.DrawLines(pen, points);
}


2.绘制形状:
DrawRectangle(Pen pen, int x, int y, int width, int height):使用指定的 Pen 对象绘制矩形。
DrawEllipse(Pen pen, int x, int y, int width, int height):使用指定的 Pen 对象绘制椭圆。
DrawPolygon(Pen pen, Point[] points):使用指定的 Pen 对象和点数组绘制多边形。
public Form1()
{InitializeComponent();this.panel1.Paint += Panel1_Paint;this.panel2.Paint += Panel2_Paint;this.panel3.Paint += Panel3_Paint;
}
//矩形DrawRectangle(Pen pen, int x, int y, int width, int height)
private void Panel1_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);Pen pen1 = new Pen(Color.Red, 10F);Rectangle rect = new Rectangle(20,20,100,100);g.DrawRectangle(pen1, rect);
}
//椭圆DrawEllipse(Pen pen, int x, int y, int width, int height)
private void Panel2_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);Pen pen1 = new Pen(Color.Red, 10F);Rectangle rect = new Rectangle(20,20,80,100);g.DrawEllipse(pen1, rect);//椭圆
}
//多边形DrawPolygon(Pen pen, Point[] points)
private void Panel3_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);Pen pen1 = new Pen(Color.Red, 10F);Point[] points = new Point[]{new Point(80,20),new Point(20,100),new Point(120,100),};g.DrawPolygon(pen1, points);
}



3.填充形状:
FillRectangle(Brush brush, int x, int y, int width, int height):使用指定的 Brush 对象填充矩形。
FillEllipse(Brush brush, int x, int y, int width, int height):使用指定的 Brush 对象填充椭圆。
FillPolygon(Brush brush, Point[] points):使用指定的 Brush 对象填充多边形。
public Form1()
{InitializeComponent();this.panel1.Paint += Panel1_Paint;this.panel2.Paint += Panel2_Paint;this.panel3.Paint += Panel3_Paint;
}
//FillRectangle(Brush brush, int x, int y, int width, int height)
private void Panel1_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);Pen pen1 = new Pen(Color.Red, 10F);Rectangle rect = new Rectangle(20,20,100,100);Brush brush = new SolidBrush(Color.Yellow);g.FillRectangle(brush, rect);g.DrawRectangle(pen1, rect);//矩形
}
//FillEllipse(Brush brush, int x, int y, int width, int height)
private void Panel2_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);Pen pen1 = new Pen(Color.Red, 10F);Rectangle rect = new Rectangle(20,20,80,100);Brush brush = new SolidBrush(Color.Yellow);g.FillEllipse(brush, rect);g.DrawEllipse(pen1, rect);//椭圆
}
//FillPolygon(Brush brush, Point[] points)
private void Panel3_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);Pen pen1 = new Pen(Color.Red, 10F);Point[] points = new Point[]{new Point(80,20),new Point(20,100),new Point(120,100),};Brush brush = new SolidBrush(Color.Yellow);g.DrawPolygon(pen1, points);g.FillPolygon(brush,points);
}



4.绘制文本:
DrawString(String s, Font font, Brush brush, float x, float y):在指定位置绘制文本字符串。
public Form1()
{InitializeComponent();this.panel1.Paint += Panel1_Paint;
}private void Panel1_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;SetQuality(g);string s = "相寻梦里路,飞雨落花中";Font font = new Font("华文琥珀",20F);Brush brush = new SolidBrush(Color.Pink);g.DrawString(s,font,brush,10,10);}

5.图像处理:
DrawImage(Image image, Point point):在指定位置绘制图像。
DrawImage(Image image, Rectangle rect):在指定矩形区域内绘制图像。
public Form1()
{InitializeComponent();this.panel1.Paint += Panel1_Paint;this.panel1.Paint += Panel2_Paint;
}
private void Panel1_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);string path = Path.Combine(Environment.CurrentDirectory, "../../image/1.png");Image img = Image.FromFile(path);Point point = new Point( 0, 0);g.DrawImage(img, point);//在指定位置绘制图像img.Dispose(); // 释放图像资源
}
private void Panel2_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);string path = Path.Combine(Environment.CurrentDirectory, "../../image/2.png");Image img = Image.FromFile(path);Rectangle rect = new Rectangle(0,0,300,240);g.DrawImage(img, rect);img.Dispose(); // 释放图像资源
}


6.变换和剪辑:
TranslateTransform(float dx, float dy):对当前的坐标系统进行平移变换。
ScaleTransform(float sx, float sy):对当前的坐标系统进行缩放变换。
RotateTransform(float angle):对当前的坐标系统进行旋转变换。
SetClip(Rectangle rect):设置当前的剪辑区域。
代码在下面
1.平移变换 2.缩放变换 3. 旋转变换


7.获取信息:
VisibleClipBounds:获取当前剪辑区域的边界。
IsVisible(Point point):判断一个点是否在可见区域内。

代码
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Windows.Forms;
namespace 图形变换和剪辑
{public partial class Form1 : Form{public Form1(){InitializeComponent();Panel panel1 = new Panel{Size = new Size(400, 400),Location = new Point(50, 50),BackColor = Color.Green,};this.Controls.Add(panel1);panel1.Paint += Panel1_Paint; 平移变换panel1.Paint += Panel2_Paint; // 缩放变换panel1.Paint += Panel3_Paint; // 旋转变换panel1.Paint += Panel4_Paint; // 设置剪辑区域}private void Panel1_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;SetQuality(g);string path = Path.Combine(Environment.CurrentDirectory, "../../image/1.png");Image img = Image.FromFile(path);g.TranslateTransform(100, 0);g.DrawImage(img, new Point(0,0));}private void Panel2_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;SetQuality(g);string path = Path.Combine(Environment.CurrentDirectory, "../../image/1.png");Image img = Image.FromFile(path);g.ScaleTransform(1.5F,1.5F);//缩放g.DrawImage(img, new Point(-100, -100));}private void Panel3_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;SetQuality(g);string path = Path.Combine(Environment.CurrentDirectory, "../../image/1.png");Image img = Image.FromFile(path);g.RotateTransform(45); // 旋转变换g.DrawImage(img, new Point(0, 0));}private void Panel4_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;SetQuality(g);string path = Path.Combine(Environment.CurrentDirectory, "../../image/2.png");Image img = Image.FromFile(path);Rectangle clipRect = new Rectangle(50, 50, 300, 300);g.SetClip(clipRect);//设置当前编辑区// 获取信息RectangleF visibleClipBounds = g.VisibleClipBounds;Console.WriteLine($"Visible Clip Bounds: {visibleClipBounds}");Point testPoint = new Point(100, 100);bool isVisible = g.IsVisible(testPoint);Console.WriteLine($"Point {testPoint} is visible: {isVisible}");}private static void SetQuality(Graphics g){g.SmoothingMode = SmoothingMode.AntiAlias;g.CompositingQuality = CompositingQuality.HighQuality;g.InterpolationMode = InterpolationMode.HighQualityBicubic;}}
}
SetQuality()
SetQuality 方法是一个自定义方法,它不是 System.Drawing 命名空间的一部分。这个方法通常用于设置 Graphics 对象的属性,以提高绘制质量,特别是在进行图形变换、绘制文本或图像时。
SetQuality 方法设置了以下几个关键属性:
SmoothingMode:设置为SmoothingMode.AntiAlias,以启用抗锯齿,使线条和曲线更平滑。InterpolationMode:设置为InterpolationMode.HighQualityBicubic,以在图像缩放时使用高质量的双三次插值算法。PixelOffsetMode:设置为PixelOffsetMode.HighQuality,以减少图像旋转和大字体文本时的像素偏移。TextRenderingHint:设置为TextRenderingHint.AntiAliasGridFit,以提高文本渲染的质量和清晰度。CompositingQuality:设置为CompositingQuality.HighQuality,以确保在合成图像时使用高质量的算法。
using System.Drawing;
using System.Drawing.Drawing2D;
public void SetQuality(Graphics g)
{// 设置高质量渲染模式g.SmoothingMode = SmoothingMode.AntiAlias; // 抗锯齿// 设置高质量的插值模式g.InterpolationMode = InterpolationMode.HighQualityBicubic; // 高质量双三次插值// 设置高质量的像素偏移模式g.PixelOffsetMode = PixelOffsetMode.HighQuality; // 高质量像素偏移// 设置高质量的路径渐变g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; // 文本抗锯齿// 设置图形对象的线性变换和旋转变换的精度g.CompositingQuality = CompositingQuality.HighQuality; // 高质量合成
}// 在 Paint 事件处理程序中使用 SetQuality 方法
private void MyControl_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g); // 应用高质量设置// 现在使用 g 绘制文本、线条、形状等g.DrawString("Hello, World!", new Font("Arial", 16), Brushes.Black, new PointF(10, 10));
}
相关文章:
C#中的Graphics类和SetQuality()自定义方法
在 C# 中,Graphics 类是 System.Drawing 命名空间的一部分,它提供了一组方法和属性,用于在 Windows Forms 应用程序中进行二维绘图。Graphics 对象可以绘制文本、线条、曲线、形状和图像,并可以对它们进行变换和剪辑。 Graphics …...
圣诞节:白酒与西式料理的异国风情
随着冬日的脚步渐近,圣诞的钟声即将敲响。在这个充满异国情调和温馨氛围的节日里,一场中西合璧的美食盛宴悄然上演。豪迈白酒(HOMANLISM)与西式料理的碰撞,不仅为圣诞餐桌增添了几分不同的韵味,更让人们在这…...
2.ChatGPT的发展历程:从GPT-1到GPT-4(2/10)
引言 在人工智能领域,自然语言处理(NLP)是连接人类与机器的重要桥梁。随着技术的不断进步,我们见证了从简单的文本分析到复杂的语言理解的转变。ChatGPT,作为自然语言处理领域的一个里程碑,其发展历程不仅…...
yjs01——机器学习的过程
ps:换了阿婆主重新看机器学习 机器学习的过程: 1.获取数据——2.数据基本处理——>3.特征工程——>4.机器学习(模型训练)—>模型评估 获取数据: 1.专有名词: 1.样本:一行数据是一个样本…...
Git工作流程
git 工作流程 克隆或同步远程仓库 使用git clone命令将本仓库完全镜像一份至本地 使用git pull命令将远程仓库代码同步到本地新建或修改代码文件后,将代码提交到暂存区;(git add filename)将暂存区域的文件提交到本地git仓库。(git commit filename -m …...
Qt-QWidget的font属性(18)
目录 描述 相关API 使用 使用Qt Designer设置字体 使用纯代码设置字体 描述 这个是用来设置字体样式的 相关API 使用 我们创建一个新的项目 使用Qt Designer设置字体 使用纯代码设置字体 相比于上面使用Qt Designer,用代码来实现就要灵活的多,主…...
Go语言概述
1.Go语言的特点 1)从语言层面支持并发,实现简单 2)goroutine,轻量级线程,可实现大并发处理,高效利用多核 3)垃圾回收机制,内存自动回收,不需要开发人员管理 4࿰…...
P6627 [省选联考 2020 B 卷] 幸运数字
*原题链接* 并不是非常难的题,不过细节非常多。 首先大题思路很明确,把所有条件储存下来,把这些l,r,x啥的离散化,然后区间异或,最后查询最大值。至于区间异或用差分就好了,因为异或…...
活动|华院计算宣晓华受邀出席“AI引领新工业革命”大会,探讨全球科技的最新趋势
8月31日,“AI引领新工业革命”大会于上海图书馆圆满落幕。本次大会由TAA校联会和台协科创工委会联合主办,得到上海市台办、上海市台联、康师傅的大力支持。大会邀请了NVIDIA全球副总裁、亚太区企业营销负责人刘念宁,元禾厚望资本创始合伙人潘…...
k8s配置
一、前期准备 1、修改主机的/etc/hosts文件挟持域名 [rootk8s-master ~]# vim /etc/hosts 192.168.8.199 k8s-master 192.168.8.200 k8s-node1 192.168.8.201 k8s-node2 2、配置yum源 [rootk8s-master ~]# cd /etc/yum.repos.d/ [rootk8s-master yum.repos.d]# vim kubernetes…...
力扣第79题 单词搜索
前言 记录一下刷题历程 力扣第79题 单词搜索 单词搜索 原题目:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻…...
【系统架构设计师】抽象工厂设计模式
抽象工厂(Abstract Factory)模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在抽象工厂模式中,客户端不依赖于产品类实例的如何被创建、组合和表达的细节,这对于产品族(即一组相互关联或相互依赖的产品)的创建尤其…...
海外云手机有哪些推荐?
随着云手机的发展,越来越多的企业和个人开始使用云手机来满足他们的海外业务需求。用户可以通过云手机实现方便、快捷的海外访问,一般用来进行tiktok运营、亚马逊电商运营、海外社媒运营等操作。海外云手机平台有很多,以下是一些比较好的云手…...
旋转目标检测对照实验-mmrotate基础教程
环境安装和测试可以参考mmrotate旋转目标检测实战指南_validate mmrotate-CSDN博客 使用自定义数据集训练 如果需要使用自己的数据集进行训练,首先需要把自己数据的标签格式转换为dota数据集的格式,形如(前八个数为坐标值,第九个…...
Spring常见的面试问答题(一)
在面试过程中,Spring几乎是必问的几个点之一,特别是其中的IOC和AOP。 Spring常见的面试问答题 什么是Spring? 首先,Spring是一个生态,但是呢,这个生态里面又有个Spring Framework框架。 所以从Spring生…...
STM32 之 SDRAM 详解
目录 前言 一、SDRAM 简介 二、SDRAM的组成原理 2.1存储单元阵列 2.1.1地址译码 2.1.2存储电容 2.2控制逻辑 2.2.1时钟同步 2.2.2命令解码 2.2.3模式寄存器 2.3数据输入 / 输出缓冲 2.3.1数据总线 2.3.2数据锁存 2.4刷新电路 2.4.1自动刷新 2.4.2自刷新 三、S…...
基于图神经网络的最大独立集问题的目标分支
文章目录 Abstract1 Introduction2 Related Work分支顶点选择图神经网络Abstract 分支归约方法结合了分支约束原则和归约规则,在处理以前无法管理的现实世界实例方面特别成功。分支策略决定下一个要在哪个顶点上进行分支。最近,最广泛使用的策略是选择最高度的顶点。 在这项…...
【Qt】事件过滤器
事件过滤器 在 Qt 中,⼀个对象可能经常要查看或拦截另外⼀个对象的事件,如对话框想要拦截按键事件,不让别的组件接收到,或者修改按键的默认值等。通过上⾯的学习,我们已经知道,Qt 创建了 QEvent事件对象之后…...
字符串转换为整数、整数转换为字符串
整数转换为字符串 sprintf()它的功能是将各种类型的数据格式化为字符串,并存储到一个字符数组中。 sprintf 是 C 语言标准库中的一个函数,用于将格式化的数据写入一个字符串中。它的用法与 printf 类似,但不同的是,printf 输出到…...
解决samba无权限创建文件问题
将我服务器利用samba工具映射到到电脑后,没有权限在特定的文件里写文件,比如在mcu这个文件夹里面没有写文件的权限。 查看mcu文件夹的用户属性,属于root属性。 rootzwzn2064-CVN-Z690D5-GAMING-PRO:/home/zwzn2064# ls -ll total 9714860 dr…...
7步构建个性化定制:Degrees of Lewdity中文整合包深度改造指南
7步构建个性化定制:Degrees of Lewdity中文整合包深度改造指南 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS DOL-CHS-MODS是一款基于Degrees of Lewdity中文汉化版的自动化构建系统&am…...
行波管(TWT)核心参数权衡:填充比、流通率与电子注效率的物理本质及工程设计
在行波管(TWT)设计中,填充比(F)、流通率(ηₜᵣₐₙₛ)与电子注效率(ηₑ)是决定器件性能的三大核心参数,三者并非独立存在,而是形成了紧密的物理…...
从零部署到实战标注:SUSTechPOINTS 3D点云标注平台全流程指南
1. 为什么选择SUSTechPOINTS进行3D点云标注 在自动驾驶研发过程中,3D点云标注是个绕不开的苦差事。我最早用过不少商业标注工具,不是价格贵得离谱,就是功能残缺不全。直到去年团队接手一个校企合作项目,才发现南方科技大学开源的这…...
万物识别镜像高级功能探索:除了基础识别,还能做什么?
万物识别镜像高级功能探索:除了基础识别,还能做什么? 1. 万物识别镜像的隐藏潜力 大多数人使用万物识别镜像时,只停留在基础识别功能上——上传图片,获取识别结果。但这款基于cv_resnest101_general_recognition算法…...
FileConverter:重构文件格式转换流程,实现设计师与教育工作者的效率突破
FileConverter:重构文件格式转换流程,实现设计师与教育工作者的效率突破 【免费下载链接】FileConverter File Converter is a very simple tool which allows you to convert and compress files using the context menu in windows explorer. 项目地…...
GLM-4.1V-9B-Base开发入门:PyCharm专业版连接远程解释器进行模型调试
GLM-4.1V-9B-Base开发入门:PyCharm专业版连接远程解释器进行模型调试 1. 为什么需要远程调试 在AI模型开发过程中,我们经常遇到一个典型问题:本地机器性能不足,无法高效运行大型语言模型。GLM-4.1V-9B-Base这类模型通常需要GPU加…...
背包模型(求组合)?爬楼梯模型(求排列)?
普通背包模型和爬楼梯模型是非常相似的两个模型。 首先,我们定义一个**“抽象背包模型”**(注意这个抽象背包模型不是前面提到的普通背包模型):给定 n 个物品,装满容积为 m 的背包,求方案数/具体方案/等等…...
Linux I2C设备驱动避坑指南:以MPU6050为例,详解i2c_transfer与数据读取失败
Linux I2C设备驱动深度调试:MPU6050通信稳定性问题全解析 当你在嵌入式系统中集成MPU6050传感器时,是否遇到过这样的场景:设备树配置正确,驱动代码逻辑清晰,但传感器数据读取却间歇性失败,内核日志中频繁出…...
别再手动查ID了!用R包一键搞定单细胞Marker基因ID转换(附org.Hs.eg.db实战)
单细胞Marker基因ID转换实战:用org.Hs.eg.db实现高效精准映射 刚完成单细胞聚类分析的研究者,常常会面临一个看似简单却极其耗时的任务——将Marker基因的Symbol标识转换为标准的Entrez ID。这个步骤虽然基础,却直接影响后续GO富集分析的可靠…...
MongoDB:如何构建“数据回收站“,防止人为误删数据(延迟节点)
更多内容请见: 《深入掌握MongoDB数据库》 - 专栏介绍和目录 一、引言:数据误删的现实挑战 在企业级数据库系统中,人为误删数据是导致业务中断的常见原因。根据2023年数据库安全报告,37%的数据丢失事件是由人为错误引起的,其中误删除操作占主要部分。MongoDB作为企业级No…...
