【C#】图形图像编程

实验目标和要求:

  1. 掌握C#图形绘制基本概念;
  2. 掌握C#字体处理;
  3. 能进行C#图形图像综合设计。

运行效果如下所示:

1.功能说明与核心代码

使用panel为画板,完成以下设计内容:

  1. 使用pen绘制基础图形;
  2. 使用LinearGradientBrush实现渐变色字体;
  3. 使用GraphicsPath实现艺术字,部分核心代码如下所示;
GraphicsPath gp = new GraphicsPath(FillMode.Winding);

            gp.AddString(

                "字体轮廓",new FontFamily("方正舒体"),(int)FontStyle.Regular,

                80,new PointF(10, 20),new StringFormat());

            Brush brush = XXXXXXXXXXXXXXXXXXXXXX;

            XXX.DrawPath(Pens.Green, gp);

            XXX.FillPath(brush, gp);

实现:

     1.在vs中开一个c#的窗体应用:

  2 .在设计界面中拉取两个button,一个textbox(用于输出自己想输出的内容(艺术字))以及一个panel(输出在panel上显示)

  3.代码

(1)button1:

private void button1_Click(object sender, EventArgs e)
{
    drawBasicShapes = true;
    drawArtText = false;
    DrawBasicShapes();
    panel1.Invalidate(); // 触发重绘
}

(2)button2:

 private void button2_Click(object sender, EventArgs e)
 {
     drawBasicShapes = false;
     drawArtText = true;
     DrawArtText();
     panel1.Invalidate(); // 触发重绘
 }

(3)button1调用的函数DrawBasicShapes():

private void DrawBasicShapes()
{
    // 使用 Pen 绘制基础图形
    Pen blackPen = new Pen(Color.Black, 3);
    drawingGraphics.DrawRectangle(blackPen, 10, 70, 100, 50);
    drawingGraphics.DrawEllipse(blackPen, 10, 70, 100, 50);

    // 使用 LinearGradientBrush 实现渐变色字体
    Font font = new Font("Arial", 24);
    LinearGradientBrush gradientBrush = new LinearGradientBrush(
        new Rectangle(10, 20, 100, 50),
        Color.Blue,
        Color.Red,
        45);
    drawingGraphics.DrawString("直接拿捏", font, gradientBrush, new PointF(10, 150));
}

(4)button2调用的函数 DrawArtText():

private void DrawArtText()
{
    string text = textBox1.Text;
    using (Font font = new Font("方正舒体", 40, FontStyle.Regular))
    using (GraphicsPath gp = new GraphicsPath(FillMode.Winding))
    using (SolidBrush brush = new SolidBrush(Color.AliceBlue)) // 使用 SolidBrush 填充艺术字  
    using (Pen pen = new Pen(Color.Green, 2)) // 使用 Pen 绘制艺术字的轮廓  
    {
        gp.AddString(
            text,
            font.FontFamily,
            (int)font.Style,
            font.Size,
            new PointF(80, 30), // 设置艺术字的起始位置  
            StringFormat.GenericDefault);

        drawingGraphics.DrawPath(pen, gp); // 绘制艺术字的轮廓  
        drawingGraphics.FillPath(brush, gp); // 填充艺术字  
    }
}

(5)panel:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    // 将 Bitmap 绘制到 Panel 上
    e.Graphics.DrawImage(drawingBitmap, 0, 0);
}

4.代码细节补充(完整代码)

using System.Drawing.Drawing2D;
using System.Drawing;
using System.Windows.Forms;
using System;

namespace 图形图像编程
{
    public partial class Form1 : Form
    {
        // 标志位
        private bool drawBasicShapes = false;
        private bool drawArtText = false;

        // Bitmap 对象,用于保存绘制的图像
        private Bitmap drawingBitmap;
        private Graphics drawingGraphics;

        // 构造函数
        public Form1()
        {
            InitializeComponent();

            // 初始化 Bitmap 和 Graphics 对象
            drawingBitmap = new Bitmap(panel1.Width, panel1.Height);
            drawingGraphics = Graphics.FromImage(drawingBitmap);

            // 绑定按钮点击事件
            button1.Click += new EventHandler(this.button1_Click);
            button2.Click += new EventHandler(this.button2_Click);
            panel1.Paint += new PaintEventHandler(this.panel1_Paint);
        }

        // 绘制基础图形按钮点击事件处理
        private void button1_Click(object sender, EventArgs e)
        {
            drawBasicShapes = true;
            drawArtText = false;
            DrawBasicShapes();
            panel1.Invalidate(); // 触发重绘
        }

        // 添加艺术字按钮点击事件处理
        private void button2_Click(object sender, EventArgs e)
        {
            drawBasicShapes = false;
            drawArtText = true;
            DrawArtText();
            panel1.Invalidate(); // 触发重绘
        }

        // 绘制基础图形的方法
        private void DrawBasicShapes()
        {
            // 使用 Pen 绘制基础图形
            Pen blackPen = new Pen(Color.Black, 3);
            drawingGraphics.DrawRectangle(blackPen, 10, 70, 100, 50);
            drawingGraphics.DrawEllipse(blackPen, 10, 70, 100, 50);

            // 使用 LinearGradientBrush 实现渐变色字体
            Font font = new Font("Arial", 24);
            LinearGradientBrush gradientBrush = new LinearGradientBrush(
                new Rectangle(10, 20, 100, 50),
                Color.Blue,
                Color.Red,
                45);
            drawingGraphics.DrawString("直接拿捏", font, gradientBrush, new PointF(10, 150));
        }

        // 绘制艺术字的方法
        private void DrawArtText()
        {
            string text = textBox1.Text;
            using (Font font = new Font("方正舒体", 40, FontStyle.Regular))
            using (GraphicsPath gp = new GraphicsPath(FillMode.Winding))
            using (SolidBrush brush = new SolidBrush(Color.AliceBlue)) // 使用 SolidBrush 填充艺术字  
            using (Pen pen = new Pen(Color.Green, 2)) // 使用 Pen 绘制艺术字的轮廓  
            {
                gp.AddString(
                    text,
                    font.FontFamily,
                    (int)font.Style,
                    font.Size,
                    new PointF(80, 30), // 设置艺术字的起始位置  
                    StringFormat.GenericDefault);

                drawingGraphics.DrawPath(pen, gp); // 绘制艺术字的轮廓  
                drawingGraphics.FillPath(brush, gp); // 填充艺术字  
            }
        }

        // Panel的Paint事件处理
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            // 将 Bitmap 绘制到 Panel 上
            e.Graphics.DrawImage(drawingBitmap, 0, 0);
        }
    }
}

运行结果:

小结:

1.实现细节

·  创建项目和设计窗体

  • 新建一个Windows Forms应用程序项目。
  • 在窗体上添加一个Panel控件和两个Button控件以及textbox。
  • 设置Button控件的文本为“绘制基础图形”和“添加艺术字”。

·  初始化绘图资源

  • 在窗体构造函数中,初始化一个Bitmap对象和一个Graphics对象。
  • 将Bitmap对象的大小设置为Panel控件的大小。
  • 使用Graphics.FromImage方法从Bitmap对象创建一个Graphics对象,用于绘图。

·  实现按钮点击事件处理函数

  • 在第一个按钮的点击事件处理函数中,调用绘制基础图形的方法。
  • 在第二个按钮的点击事件处理函数中,调用绘制艺术文字的方法。
  • 在每个事件处理函数中,调用panel1.Invalidate方法,触发重绘。

·  实现绘图方法

  • 在绘制基础图形的方法中,使用Pen对象绘制矩形和椭圆,使用LinearGradientBrush对象绘制渐变色文字。
  • 在绘制艺术文字的方法中,使用GraphicsPath对象创建艺术文字的路径,并使用SolidBrush对象填充文字。

·  处理PanelPaint事件

  • 在Paint事件处理函数中,使用Graphics.DrawImage方法将Bitmap对象绘制到Panel控件上。

2.小结

本次实验通过使用GDI+进行图形和文字的绘制,成功实现了一个可以动态更新绘图内容的Windows窗体应用程序。关键点在于使用Bitmap对象作为绘图表面,从而保留之前的绘图内容。这种方法适用于需要动态更新和保留图形内容的应用场景

难点分析

(1)Bitmap与Graphics的初始化和使用:

         初始化Bitmap和Graphics对象并确保它们的大小与Panel一致,这样才能确保绘制内容能够正确显示在Panel上。

         在Panel的Paint事件中使用Graphics.DrawImage方法将Bitmap绘制到Panel上,以实现内容的保留和更新。

(2)不同绘图操作的协调:

         实现多个绘图方法并确保它们能够在同一个Bitmap对象上操作,不会互相覆盖或清除之前的绘图内容。

(3)处理界面刷新:

         通过调用panel1.Invalidate方法触发重绘,并在Paint事件中绘制Bitmap对象,这样可以确保每次绘制新内容时,之前的内容不会被清除。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django初学者指南

文章目录 Django初学者指南1 Django简介1.1 Django的历史1.2 使用Django的知名网站1.4 Django的主要特点1.5 Django的工作原理 2 Django 使用2.1 Django 支持的 Python 版本2.2 Django 版本 3 Django 开发 Web 程序3.1 安装Django3.2 创建Django项目3.3 运行开发服务器3.4 创建…

【纯干货级教程】深度学习根据loss曲线进行分析调参

相信很多刚刚接触目标检测系列算法小伙伴跑深度学习算法时会有许多困惑,比如训练得出的loss曲线有什么意义?训练的一些参数要如何设置选择?选择哪个算法模型作为baseline、选择哪个参数量/复杂度/深度的模型进行训练最为合适? 本…

在VS Code中快速生成Vue模板的技巧

配置vue.json: { "Print to console": {"prefix": "vue","body": ["<template>"," <div class\"\">\n"," </div>","</template>\n","<scri…

如何在WIndows虚拟机安装 macOS 黑苹果系统?

在本教程中&#xff0c;我们将介绍如何在虚拟机上安装 macOS 黑苹果系统。黑苹果系统是非苹果公司官方支持的 macOS 系统的非官方版本&#xff0c;可以在普通 PC 上运行。请注意&#xff0c;安装黑苹果系统可能违反苹果的许可协议&#xff0c;请自行承担风险。参考视频教程&…

Linux之BCC 性能工具的移植和使用

一、bcc 工具 bcc 的全称&#xff1a;BPF Compiler Collection BCC&#xff08;BPF Compiler Collection&#xff09;是一个用于创建高效的内核跟踪和操作程序的工具包&#xff0c;包含了几个有用的工具和示例。它利用了扩展的BPF&#xff08;Berkeley Packet Filters&#x…

欧洲杯赛况@20240615

点击标题下「蓝色微信名」可快速关注 欧洲杯首战&#xff0c;德国5:1狂胜苏格兰&#xff0c;大比分、红点套餐、超新星登场进球&#xff0c;好像这些能想到的元素都发挥了作用&#xff0c;作为东道主&#xff0c;聚集了天时地利人和&#xff0c;可以说是完美&#xff0c;这就是…

记录:利用 Agora 在 Unity3D MRTK场景中创建实时视频聊天应用

目录 准备1. 安装Agora_Unity_RTC_SDK2. 创建UI3. script具体内容4. 使用测试 本质是两部带摄像机的设备同时进入Agora聊天室内视频。 去年实现过一次这个功能&#xff0c;用的是Agora_Unity_RTC_SDK 4.2.2版本的&#xff0c;今年使用失败&#xff0c;遂重新安装最新版本Agora…

docker安装消息队列mq中的rabbit服务

在现代化的分布式系统中&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;已经成为了一种不可或缺的组件。RabbitMQ作为一款高性能、开源的消息队列软件&#xff0c;因其高可用性、可扩展性和易用性而广受欢迎。本文将详细介绍如何在Docker环境中安装RabbitMQ服务…

中文版svn怎么忽略文件

个人需求&#xff1a; 不上传dist&#xff0c;dist.7z&#xff0c;node_modules等文件夹 实际操作&#xff1a; 前言&#xff1a;在上传svn为避免操作失败导致丢失文件的情况&#xff0c;保险起见&#xff0c;先备份代码 1&#xff1a;右键点击 2&#xff1a;点击新建 – 其…

【C++】图1

并查集 template <class T> class UnionFindSet { public:UnionFindSet(size_t n):_ufs(n, -1){}void Union(int x1, int x2){int root1 FindRoot(x1);int root2 FindRoot(x2);if (root1 root2)return;if (root1 > root2)swap(root1, root2);_ufs[root1] _ufs[ro…

uniapp开发微信小程序问题汇总

1. 自定义校验规则validateFunction失效 2. 微信小程序不支持<Br>换行 在 <text></text> 标签中使用\n(必须 text 标签&#xff0c;view 标签无效 ) 3. 微信小程序无法使用本地静态资源图片的解决方法 (1) 将图片上传到服务器&#xff0c;小程序访问该图片…

非对称加密系统解析

目录 1. 概述 2. 非对称加密标准 2.1 RSA 2.2 SM2 2.2.1 SM2私钥 2.2.2 SM2公钥 2.2.3 加密数据格式 2.2.4 签名数据格式 1. 概述 非对称加密中&#xff0c;密钥分为加密密钥和解密密钥两种。发送者用加密密钥对消息进行加密&#xff0c;接收者用解密密钥对密文进行解密…

Leetcode - 132双周赛

目录 一、3174. 清除数字 二、3175. 找到连续赢 K 场比赛的第一位玩家 三、3176. 求出最长好子序列 I 四、3177. 求出最长好子序列 II 一、3174. 清除数字 本题可以使用栈来模拟&#xff0c;遇到数字弹出栈顶元素&#xff0c;遇到字母入栈。 代码如下&#xff1a; //使用字…

网络编程(二)TCP

一、TCP网络编程 网络编程模型&#xff1a; C/S模型&#xff1a;客户端服务器模型 优点&#xff1a; 客户端可以缓存一些数据&#xff0c;使用时直接在本地读取&#xff0c;无需每次重新下载&#xff1b; 由于客户端和服务器都是自己开发的&#xff0c;可以自定义协议 缺点&a…

基于carsim的线控转向仿真(1)--carsim车辆模型目标角度跟踪

一、Rwa转向执行总成建模 Rwa包括齿轮齿条机构、转向组件以及转向执行电机&#xff1b;如下图&#xff0c;电机输出轴通过齿轮减速增扭后&#xff0c;再经过一个半径为rp的小齿轮&#xff0c;直接带动齿条左右移动。齿条的移动通过转向摇臂&#xff0c;带动车轮转动&#xff0c…

Excel/WPS《超级处理器》功能介绍与安装下载

超级处理器是基于Excel或WPS开发的一款插件&#xff0c;拥有近300个功能&#xff0c;非常简单高效的处理表格数据&#xff0c;安装即可使用。 点击此处&#xff1a;超i处理器安装下载 Excel菜单&#xff0c;显示如下图所示&#xff1a; WPS菜单显示&#xff0c;如下图所示&am…

15. 第十五章 类和对象

15. 类和对象 到现在你已经知道如何使用函数组织代码, 以及如何使用内置类型来组织数据. 下一步将学习面向对象编程, 面向对象编程使用自定义的类型同时组织代码和数据. 面向对象编程是一个很大的话题, 需要好几章来讨论.本章的代码示例可以从↓下载, https://github.com/Alle…

嵌入式实训day3

1、 # 82261773 # y6ufuT9yGQxddpSzSe3zZpbP # BJsEfKFNGOwHtLuKoHsfVIWrGWjXVKut"""1、PC需要联网2、不能使用MicroPython解释器 """ from aip import AipFace import base64# 查看REST-API-SDK if __name__ "__main__":# 设置APP_I…

数字电路中二进制的数据表达

文章目录 1. 二进制数据表达 1.1 二进制简介 1.2 用二进制表达文字 1.2.1 最开始的表达方式 1.2.2 通讯系统的编码和解码 1.2.3 集成电路 1.2.4 ASCII编码 1.2.5 GBK编码 1.2.6 Unicode编码 2. 用二进制表达图像 2.1 图片像素化 2.2 像素数字化 2.3 二值图像 2.4…

C++ 43 之 自增运算符的重载

#include <iostream> #include <string> using namespace std;class MyInt{friend ostream& operator<< (ostream& cout , MyInt& int1); public:MyInt(){this->m_num 0;}// 前置自增&#xff1a; 成员函数实现运算符的重载 返回的是 引用&a…