首页 > 编程语言 >C#图形图像编程

C#图形图像编程

时间:2024-06-18 20:31:59浏览次数:15  
标签:gp C# 图形图像 编程 private using new font 绘制

一.实验目标和实验内容:

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

运行效果如下所示:

二.准备

(1)创建一个新项目:

(2)在工具箱中拖出四个控件,button1,button2,panel,textbox(可单击控件在右下角修改名字)

三.代码实现

(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)panel

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

(4)绘制基础图形

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, 10));
}

(5)绘制艺术字

private void DrawArtText()
{
    string text = textBox1.Text;
    using (Font font = new Font("方正舒体", 40, FontStyle.Regular))
    using (GraphicsPath gp = new GraphicsPath(FillMode.Winding))
    {
        gp.AddString(
            text,
            font.FontFamily,
            (int)font.Style,
            font.Size,
            new PointF(150, 50), // 设置艺术字的起始位置  
            StringFormat.GenericDefault);

        // 使用 SolidBrush 填充艺术字
        using (SolidBrush brush = new SolidBrush(Color.Blue))
        {
            drawingGraphics.FillPath(brush, gp); // 填充艺术字
        }

        // 使用 Pen 绘制艺术字的轮廓
        using (Pen pen = new Pen(Color.Blue, 2))
        {
            drawingGraphics.DrawPath(pen, gp); // 绘制艺术字的轮廓
        }
    }
}

四.完整代码

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, 10));
        }

        // 绘制艺术字的方法
        private void DrawArtText()
        {
            string text = textBox1.Text;
            using (Font font = new Font("方正舒体", 40, FontStyle.Regular))
            using (GraphicsPath gp = new GraphicsPath(FillMode.Winding))
            {
                gp.AddString(
                    text,
                    font.FontFamily,
                    (int)font.Style,
                    font.Size,
                    new PointF(150, 50), // 设置艺术字的起始位置  
                    StringFormat.GenericDefault);

                // 使用 SolidBrush 填充艺术字
                using (SolidBrush brush = new SolidBrush(Color.Blue))
                {
                    drawingGraphics.FillPath(brush, gp); // 填充艺术字
                }

                // 使用 Pen 绘制艺术字的轮廓
                using (Pen pen = new Pen(Color.Blue, 2))
                {
                    drawingGraphics.DrawPath(pen, gp); // 绘制艺术字的轮廓
                }
            }
        }

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

五.运行结果

(1)点击button1

(2)在textbox中输入你想展现的内容,再点击button2

六.总结

在本次实验中,我们学习了如何使用 C# 和 WinForms 进行图形图像编程。我们首先学习了如何创建一个基本的 Windows 窗体应用程序,并在窗体上添加控件。接着,我们探讨了如何使用 Graphics 对象来进行绘图操作,包括绘制基本图形和处理文本输出。

在实验中,我们实现了以下功能:

  1. 绘制基本图形:我们学会了如何使用 Graphics 对象在面板上绘制矩形和椭圆,并且掌握了如何使用画笔来设置绘图属性。
  2. 添加艺术字:我们学会了如何在面板上绘制艺术字,包括设置字体、测量文本尺寸以及使用渐变色来绘制文本。

通过本次实验,我对 C# 中的图形图像编程有了更深入的了解,掌握了一些常用的绘图技巧和方法。这将对我的软件开发能力产生积极的影响,使我能够更好地处理与图形图像相关的任务和项目。

七.重难点

使用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);

标签:gp,C#,图形图像,编程,private,using,new,font,绘制
From: https://blog.csdn.net/m0_74724723/article/details/139741242

相关文章

  • flask部署mtcnn
    目录保存检测结果浏览器查看nginx url图片检测人脸 Flaskhello-world Flask+mtcnnpython调flask+mtcnn 示例图片:打印人脸检测信息 importcv2frommtcnn.mtcnnimportMTCNNimg=cv2.cvtColor(cv2.imread('./face.png'),cv2.COLOR_BGR2RGB)detector=......
  • go gin web服务器使用fvbock/endless优雅地重启或停止
    gin使用fvbock/endlessgin正常使用注册路由时:packagemainimport"github.com/gin-gonic/gin"funcmain(){ r:=gin.Default() r.GET("/ping",func(c*gin.Context){ c.JSON(200,gin.H{ "message":"pong", }) }) r.Run......
  • nacos-gateway搭建
    引入依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId>&l......
  • NetMvc通过亚马逊方式服务器端和客户端上传MinIO顺利解决
    前言:1、由于项目是.NETFramework4.7MVCLayUI,所以需要找一个资源站点存放项目中静态资源文件;2、需要支持服务端和客户端都支持上传文件方式;3、调用简单,涉及库越少越好。结果:调用AWSSDK.S3和AWSSDK.Core实现文件上传到MinIO;调用MimeMapping获取文件ContentType......
  • abstract 的 method 是否可同时是 static,是否可同时是 native,是否可同时是 synchroni
    在Java中,abstract方法不能同时是static、native或synchronized。让我们详细解释每种情况,并提供相应的代码示例和解释:abstract方法不能是static:abstract方法必须被子类实现,而static方法是与类相关的,而不是与实例相关的。因此,不能将一个方法同时声明为abstract和......
  • C++PrimerPlus:第十三章类和继承:访问控制:protected
    第十三章类和继承:访问控制:protected提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:访问控制:protected提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录第十三章类和继承:访问控制:protected前言一、访问控制:protected总结......
  • 论文阅读:Corrective Retrieval Augmented Generation
    CorrectiveRetrievalAugmentedGeneration(https://arxiv.org/pdf/2401.15884.pdf)https://github.com/jiangnanboy/paper_read_note一.序言RAG即检索增强生成(retrievalaugmentedgeneration),当检索到不准确的数据时,会产生对模型的生成干扰。CorrectiveRetrievalAugme......
  • 论文阅读:T-RAG: LESSONS FROM THE LLM TRENCHES
    T-RAG:LESSONSFROMTHELLMTRENCHES(https://arxiv.org/abs/2402.07483)https://github.com/jiangnanboy/paper_read_note一.概述大型语言模型(llm)越来越多地应用于各个领域,包括对私有企业文档的问答,其中数据安全性和鲁棒性至关重要。检索增强生成(retrieve-augmented......
  • 论文阅读:UniMS-RAG: Unified Multi-Source RAG for Personalised Dialogue
    UniMS-RAG:UnifiedMulti-SourceRAGforPersonalisedDialogue(https://arxiv.org/abs/2401.13256)https://github.com/jiangnanboy/paper_read_note一.概述本研究探讨如何分解RAG过程,加入多文件检索、记忆和个人信息等元素。大型语言模型(llm)在自然语言任务中表现出色,但......
  • C# 数字转罗马数字
    最近遇到一个需要整数转罗马数字的问题罗马数字的规则:I→1V→5X→10L→50C→100D→500M→1000字母从大到小依次排列,例如:8→XIII但存在一种特殊情况,使得小字母在大字母右侧,来表示后者减去前者:I可以放在V......