【C#】图形图像编程

news2024/11/25 0:25:21

实验目标和要求:

  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对象,这样可以确保每次绘制新内容时,之前的内容不会被清除。

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

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

相关文章

浅谈golang字符编码

1、 Golang 字符编码 Golang 的代码是由 Unicode 字符组成的,并由 Unicode 编码规范中的 UTF-8 编码格式进行编码并存储。 Unicode 是编码字符集,囊括了当今世界使用的全部语言和符号的字符。有三种编码形式:UTF-8,UTF-16&#…

【LeetCode215】数组中的第K个最大元素

题目地址 1. 基本思路 用一个基准数e将集合S分解为不包含e在内的两个小集合 S 1 S_{1} S1​和 S 2 S_{2} S2​,其中 S 1 S_{1} S1​的任何元素均大于等于e, S 2 S_{2} S2​的任何元素均小于e,记 ∣ S ∣ |S| ∣S∣代表集合S元素的个数&…

C++ string字符串的使用和简单模拟实现

目录 前言 1. string简介 2. string的使用和简单模拟实现 2.1 string类的定义 2.2 string(),~string()和c_str() 2.2 size,重载符号[ ],begin和end函数 2.3 push_back,reserve,append,运算符重载 2.4 insert和…

记录AE快捷键(持续补充中。。。)

记录AE快捷键 快捷键常用快捷键图层快捷键工具栏图层与属性常用指令视图菜单时间轴常规快捷键项目首选项功能摄像机操作 常用操作导入AI/PS工程文件加选一个关键参数快速回到上下一帧隐藏/显示图层关键帧拉长缩短关键帧按着鼠标左键不松手,在秒表那一列往下移动会都…

用CloudCompare软件拟合点云中的圆柱体

用CloudCompare软件拟合点云中的圆柱体 软件下载 点击下面的链接,进入下载页面: 下载页面 然后根据需要选择下载合适的软件版本。 一般选择windows installer版,如图所示: 下载完成后,安装并打开软件。软件的默认语…

重生奇迹MU圣导师简介

出生地:勇者大陆 性 别:男 擅 长:统率&宠物使用 转 职:祭师(3转) 介 绍:当玩家账号中有一个Lv250以上角色时,便可以创建职业为圣导师的新角色,圣导师每升一级获得…

经典电源电路基础(变压-整流-滤波-稳压)

1.电源电路的功能和组成 电子电路中的电源一般是低压直流电,先把220v交流电变换成低压直流电,再用整流电路变成脉动的直流电,最后用滤波电路滤除掉脉动直流中的交流成分后才能得到直流电。有的电子设备对电源的质量要求很高,所以…

MQTTfx连接阿里云(详细版)

1、介绍 作为物联网开放平台,阿里云可谓是吸引大多数嵌入式爱好者的平台。物联网MQTT协议火热的今天,你使用过阿里云吗?本篇文章带你接触阿里云,实现MQTT通信。 我们在测试MQTT之前先了解下什么是MQTT协议。大家都知道它是一种发…

【2024最新精简版】SpringBoot面试篇

文章目录 Spring和SpringBoot的区别 ?讲一讲SpringBoot自动装配的原理👍讲一讲SpringBoot启动流程你们常用的Starter有哪些👍如何定义一个SpringBoot的starter 👍SpringBoot支持的配置文件有哪些👍讲一讲SpringBoot项目配置文件的…

用Python比较对象==与is,你还在用==?out啦,来看这个!

目录 1、基础比较:== 和 is 📐 1.1 ==:值的比较 1.2 id()函数揭秘对象身份 1.3 is:身份的辨识 1.4 实战演练:列表、字典的比较陷阱 列表比较陷阱 2、深入理解比较操作符 🌀 2.1 不等号的妙用 2.2 成员资格in操作 3、自定义比较:__eq__等魔法方法 🎩 3.1 重…

蓝队-溯源技巧

溯源技巧 大致思想 通常情况下,接到溯源任务时,获得的信息如下 攻击时间 攻击 IP 预警平台 攻击类型 恶意文件 受攻击域名/IP其中攻击 IP、攻击类型、恶意文件、攻击详情是溯源入手的点。 通过攻击类型分析攻击详情的请求包,看有没有攻击者…

1586. 扫地机器人

问题描述 Mike同学在为扫地机器人设计一个在矩形区域中行走的算法,Mike是这样设计的:先把机器人放在出发点 (1,1)(1,1) 点上,机器人在每个点上都会沿用如下的规则来判断下一个该去的点是哪里。规则:优先向右,如果向右不能走(比如:右侧出了矩形或者右侧扫过了)则尝试向…

分布式数据库核心问题和解决方法

当下,由于成本压力以及数据保护的要求,采用国产数据库的呼声越来越高,但是国产数据库数量众多,良莠不齐,没有选择数据库比较靠谱的标准,业内真正懂得数据库的人很少,且为了这块大的蛋糕&#xf…

《C语言深度解剖》(19):从头开始全面理解C语言指针和数组

🤡博客主页:醉竺 🥰本文专栏:《C语言深度解剖》《精通C指针》 😻欢迎关注:感谢大家的点赞评论关注,祝您学有所成! ✨✨💜💛想要学习更多C语言深度解剖点击专栏…

实例详解C/C++中static与extern关键字的使用

目录 1、概述 2、编译C++代码时遇到的变量及函数重复定义的问题 3、用 extern 声明外部变量 4、extern与全局函数 5、为何在变量和函数前添加一个static关键字编译就没问题了呢? 6、静态局部变量 7、函数的声明与定义都放置到一个头文件中,不使用static,通过宏控制去…

广东启动“粤企质量提升工作会议” 着力提升产品和服务质量

6月5日,由广东质量峰会组委会牵头,联合相关质量、信用、打假和检验检测等部门共同举办的“粤企质量提升工作会议”在广州正式启动。本次工作会议旨在贯彻落实《质量强国建设纲要》及《广东省质量强省建设纲要》精神,深入开展全民质量行动,弘扬企业家和工匠精神,营造政府重视质量…

实战17:GCN+LSTM图卷积神经网络预警预测 完整代码数据集

直接看视频演示: GCN+LSTM图卷积神经网络预警预测时间序列预测_哔哩哔哩_bilibili 模型图原理: 完整代码: import torch import torch.nn as nn import torch.optim as optim from torch_geometric.nn import GCNConv from torch.utils.data import DataLoader, TensorDat…

十二星座女、具有哪些情感特质。

白羊座(奋不顾身)。金牛座(爱财如命)。双子座(灵活多变)。 巨蟹座(似水柔情)。狮子座(光明磊落)。处女座(尽善尽美)。 天秤座&#xf…

【Unity学习笔记】第十八 基于物理引擎的日月地系统简单实现

转载请注明出处: https://blog.csdn.net/weixin_44013533/article/details/139701843 作者:CSDN|Ringleader| 目录 目标数学理论资源准备数据准备代码实现Unity准备效果展示注意事项后记 目标 目标:利用Unity的物理引擎实现 “日地月三体系统” 。 效果…

CubeMX Keil Configure

// 使用外部高速晶振 外部高速晶振为8M(根据开发板上的晶振频率设置),使用 PLLCLK,HSE 选项 USART1 使用 Asynchronous,PA9,PA10引脚(USART1 引脚根据开发板上引脚设置) 设置MDK AR…