C#中的Graphics类和SetQuality()自定义方法

news2024/12/24 9:54:40

在 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 方法设置了以下几个关键属性:

  1. SmoothingMode:设置为 SmoothingMode.AntiAlias,以启用抗锯齿,使线条和曲线更平滑。
  2. InterpolationMode:设置为 InterpolationMode.HighQualityBicubic,以在图像缩放时使用高质量的双三次插值算法。
  3. PixelOffsetMode:设置为 PixelOffsetMode.HighQuality,以减少图像旋转和大字体文本时的像素偏移。
  4. TextRenderingHint:设置为 TextRenderingHint.AntiAliasGridFit,以提高文本渲染的质量和清晰度。
  5. 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));
}

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

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

相关文章

【JAVA入门】Day33 - Collections

【JAVA入门】Day33 - Collections 文章目录 【JAVA入门】Day33 - Collections Collections 是集合的工具类。其包含的方法如下表所示,其中前两个方法最为常用。 以下代码演示了如何创建集合并批量添加数据,然后打乱集合元素顺序,然后用二分法…

数据结构:(LeetCode203)移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]示例 2: 输入&#xff1…

代码随想录:343. 整数拆分

343. 整数拆分 class Solution { public:int integerBreak(int n) {int dp[100]{0};//拆分i的最大乘积为dp[i]dp[1]1;//初始化&#xff0c;主要是为了dp[2]初始for(int i2;i<n;i){for(int j1;j<i;j){ dp[i]max(dp[i],max(j,dp[j])*max(i-j,dp[i-j]));//取最大值&#x…

深入Linux轻量级进程管理:线程创建、线程ID解析与进程地址空间页表探究

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f6b2;Linux线程控制&#x1f40f;POSIX线程库&#x1f415;创建线程&#x1f41f;指令查看轻量级进程指令&#xff1a;ps -a…

Python(TensorFlow)和Java及C++受激发射损耗导图

&#x1f3af;要点 神经网络监督去噪预测算法聚焦荧光团和检测模拟平台伪影消除算法性能优化方法自动化多尺度囊泡动力学成像生物研究多维分析统计物距粒子概率算法 Python和MATLAB图像降噪算法 消除噪声的一种方法是将原始图像与表示低通滤波器或平滑操作的掩模进行卷积。…

汇编伪指令 GNU 风格(24)

先来看看关于标号的内容。 这里的局部标号是需要注意的。 全局标号&#xff0c;以及注释 可以不看。 来看一个例子&#xff1b; 这里的 BSYM 我不知道是什么意思。 在来看看关于伪操作的内容&#xff0c; 一般是以 . 开头的。 这是基本的一些操作。 然后是举例&#xff1a; …

前后端时间正确传递

引言&#xff1a;后端传递给前端去展示时间的时候将时间转化为String类型的时间数据去返回。此时就需要加上 JsonFormat 注解来解决这个问题。 框架环境配置中&#xff0c;时间配置为 情形一&#xff1a; 数据库字段exam_time类型为date 后端实体类中examTime类型为Date 1.前…

搭建VUE+VScode+elementUI环境遇到的问题

手把手教你搭建VUEVScodeelementUI开发环境-CSDN博客 vue : 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\vue.ps1&#xff0c;因为在此系统上禁止运行脚本 vue : 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\vue.ps1&#xff0c;因为在此系统上禁止运行脚本 - 知乎 更…

Django+Vue家居全屋定制系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作者&…

虚拟机苹果系统MacOS中XCode的安装

1、背景介绍 主机系统Win11&#xff0c;虚拟机VMWare17&#xff0c;苹果系统MacOS 13.6.7 2、Xcode的在线 点击应用市场&#xff0c;输入Xcode搜索&#xff1a; 看来Xcode无法安装在macOS V13上&#xff0c;直接在线安装失败。 3、采用下载安装包的方法进行安装 解决办法参考链…

Linux操作系统下的一些常用命令分享(ubuntu16.04)

注意一般Linux命令字符与字符之间都是空格来隔开的&#xff0c;所以千万不能忘记打空格&#xff0c;而且Linux区分大小写。&#xff08;目录就是文件夹&#xff09; 1、pwd 查看当前所在目录 2、查看帮助 命令 --help 但是这个命令会把所有内容一次性全部显示我们看帮助时很…

Linux远程管理工具推荐

原文阅读:【巨人肩膀社区专栏分享】Linux远程管理工具推荐 前两天xshell不让用了&#xff0c;刚好一台新电脑要装一个远程连接工具&#xff0c;准备试试其他。网上找了一些资料整理如下。 欢迎各位看官评论区说出你在使用的工具&#xff0c;期待你的使用经验分享&#xff08;…

Git的基本使用(持续更新)

基本使用 创建仓库 命令&#xff1a;git initgit init&#xff1a;将当前文件夹作为Git仓库&#xff0c;并在该文件夹中生成一个.git目录&#xff0c;该目录包含了资源的所有元数据&#xff0c;不可修改里面的内容。 git init newWareHouse&#xff1a;新建一个newWareHouse…

JVM性能监控和调优

JVM性能监控和调优 文章目录 JVM性能监控和调优性能优化的步骤GC日志分析GC日志参数测试GC分类日志结构 OOM&#xff1a;堆溢出模拟堆溢出dump文件分析gc日志分析 OOM&#xff1a;元空间溢出模拟元空间溢出dump文件分析原因及解决方案 OOM&#xff1a;GC overhead limit exceed…

python学习第二节:安装开发工具pycharm

python学习第二节&#xff1a;安装开发工具pycharm 1.下载安装包&#xff1a;https://www.jetbrains.com/pycharm/ 点击 Download 下滑页面到下面的社区版&#xff0c;&#xff08;上面的专业版是收费的&#xff0c;下面的社区版是免费的&#xff09; 2.安装 点击安装文件 …

计算机基础知识复习9.5

数据交换 电路交换&#xff1a;交换信息的两个主机之间简历专用通道&#xff0c;传输时延小&#xff0c;实时性强&#xff0c;效率低&#xff0c;无法纠正错误。 报文交换&#xff1a;信息拆分成小包(报文&#xff09;大小无限制&#xff0c;有目的/源等信息提高利用率。有转…

C++入门项目:Linux下C++轻量级Web服务器 跑通|运行|测试(小白进)

TinyWebServer是一个开源的项目&#xff0c;适合小白入门C网络编程&#xff0c;注意该项目是在linux系统下。 Linux下C轻量级Web服务器&#xff0c;助力初学者快速实践网络编程&#xff0c;搭建属于自己的服务器. 使用 线程池 非阻塞socket epoll(ET和LT均实现) 事件处理(R…

时钟分频流程

具体流程&#xff1a; 外部晶振&#xff08;XTIpll&#xff09;和 外部时钟&#xff08;EXTCLK&#xff09;经过OM【3&#xff1a;2】选择进入时钟模块 我们可以看到&#xff0c;在不同的模式下会选择不同的时钟源和状态。 时钟信号进入锁相环(PLL)后&#xff0c;会改…

Java项目:139 springboot基于SpringBoot的论坛系统设计与实现

项目介绍 论坛系统设置的角色有管理员&#xff0c;版主&#xff0c;用户等。 管理员管理论坛&#xff0c;主要是对论坛帖子增删改查以及对论坛帖子回复进行查看&#xff0c;对版主和用户进行管理&#xff0c;管理新闻等。 版主可以发布帖子&#xff0c;可以查询论坛帖子&…

Stage 模型应用程序包的结构

AppScope 目录是工具自动生成的 Module 则是工具自动生成的 entry、library&#xff0c;也可以自定义。 Module 类型 Module 有两种类型&#xff1a; Ability 类型的 Module&#xff1a;用来实现应用功能和特性&#xff0c;每一个 Ability 类型的 Module 编译以后。生成一个…