使用C#实现VS窗体应用——画图板

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:小项目
✨特色专栏: 知识分享
🥭本文内容:使用C#实现VS窗体应用——画图板
📚 ** ps **  : 阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一. 界面

二. 绘制图形

三. 修改颜色

四. 铅笔工具

五. 颜料桶

六. 橡皮擦

七. 图像彩色 

八. 撤销 

九. 重做

十. 文件保存 

十一. 文件打开 

十二. 套索操作(比较粗糙)

十三. 美白(由RGB更改实现)

十四. 透明(由透明度变化实现):

十五. 源码分享 


主要有十三个功能模块:1、绘制图形功能 2、编辑颜色功能 3、显示颜色值功能 4、铅笔工具 5、颜料桶填充功能 6、橡皮擦工具功能7、撤销功能8、重做操作功能9、保存文件功能10、打开文件功能11、套索选中像素功能12、选中区域美白功能13、修改像素透明度功能  


一. 界面

主要代码: 

namespace 画图板程序
{
    partial class Form1
    {
        /// <summary>
        ///  Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        ///  Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        ///  Required method for Designer support - do not modify
        ///  the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
            btnPen = new Button();
            btnPigmentBucket = new Button();
            button3 = new Button();
            btnEraser = new Button();
            btnColorExtractor = new Button();
            button6 = new Button();
            trackBarWidth = new TrackBar();
            pictureBox1 = new PictureBox();
            tableLayoutPanel1 = new TableLayoutPanel();
            groupBox1 = new GroupBox();
            groupBox2 = new GroupBox();
            comboBox1 = new ComboBox();
            btnDrawEllipse = new Button();
            panel8 = new Panel();
            btnDrawLine = new Button();
            btnDrawDiamond = new Button();
            btnDrawRectangle = new Button();
            btnDrawTriangle = new Button();
            btnDrawHexagon = new Button();
            btnDrawPentagon = new Button();
            btnDrawCircle = new Button();
            panelColor = new Panel();
            btnYellow = new TableLayoutPanel();
            label1 = new Label();
            tableLayoutPanel4 = new TableLayoutPanel();
            rbtnBlack = new RoundButton();
            rbtnWhite = new RoundButton();
            rbtnGray = new RoundButton();
            rbtnGreen = new RoundButton();
            rbtnRed = new RoundButton();
            rbtnLightBlue = new RoundButton();
            rBtnOrange = new RoundButton();
            rbtnBlue = new RoundButton();
            rbtnYellow = new RoundButton();
            rbtnPurple = new RoundButton();
            panel1 = new Panel();
            btnSelectColor = new RoundButton();
            panel6 = new Panel();
            panel7 = new Panel();
            tableLayoutPanel3 = new TableLayoutPanel();
            labelColor2 = new Label();
            panelCurColor1 = new Panel();
            rbtnCurColor2 = new RoundButton();
            panelCurColor2 = new Panel();
            rbtnCurColor = new RoundButton();
            labelColor1 = new Label();
            groupBox3 = new GroupBox();
            button5 = new Button();
            button2 = new Button();
            button1 = new Button();
            button4 = new Button();
            btnChangeOpacity = new Button();
            btnWhiten = new Button();
            btnLasso = new Button();
            panelBoundaryLine = new Panel();
            groupBox4 = new GroupBox();
            panel10 = new Panel();
            btnRedo = new Button();
            btnUndo = new Button();
            roundButton11 = new RoundButton();
            colorDialog1 = new ColorDialog();
            panelDrawingArea = new Panel();
            tableLayoutPanel2 = new TableLayoutPanel();
            menuStrip1 = new MenuStrip();
            文件ToolStripMenuItem = new ToolStripMenuItem();
            导入ToolStripMenuItem = new ToolStripMenuItem();
            导出ToolStripMenuItem = new ToolStripMenuItem();
            编辑ToolStripMenuItem = new ToolStripMenuItem();
            复制ToolStripMenuItem = new ToolStripMenuItem();
            剪切CtrlXToolStripMenuItem = new ToolStripMenuItem();
            粘贴CtrlvToolStripMenuItem = new ToolStripMenuItem();
            旋转ToolStripMenuItem = new ToolStripMenuItem();
            顺时针旋转90ToolStripMenuItem = new ToolStripMenuItem();
            顺时针旋转180ToolStripMenuItem = new ToolStripMenuItem();
            逆时针旋转90ToolStripMenuItem = new ToolStripMenuItem();
            逆时针旋转180ToolStripMenuItem = new ToolStripMenuItem();
            查看ToolStripMenuItem = new ToolStripMenuItem();
            保存ToolStripMenuItem = new ToolStripMenuItem();
            panel2 = new Panel();
            panel5 = new Panel();
            buttonSizeFitWindow = new Button();
            comboBoxCanvasSize = new ComboBox();
            trackBarCanvasSize = new TrackBar();
            btnBottomShrink = new Button();
            btnBottomEnlarge = new Button();
            panelButtomLeft2 = new Panel();
            panel4 = new Panel();
            labelColorB = new Label();
            panelB = new Panel();
            labelColorG = new Label();
            label2 = new Label();
            labelColorR = new Label();
            panelG = new Panel();
            panelR = new Panel();
            panelButtomLeft1 = new Panel();
            panel3 = new Panel();
            labelYShow = new Label();
            labelY = new Label();
            labelXShow = new Label();
            labelCoordinate = new Label();
            labelX = new Label();
            ((System.ComponentModel.ISupportInitialize)trackBarWidth).BeginInit();
            ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
            tableLayoutPanel1.SuspendLayout();
            groupBox1.SuspendLayout();
            groupBox2.SuspendLayout();
            panelColor.SuspendLayout();
            btnYellow.SuspendLayout();
            tableLayoutPanel4.SuspendLayout();
            panel1.SuspendLayout();
            panel6.SuspendLayout();
            tableLayoutPanel3.SuspendLayout();
            panelCurColor1.SuspendLayout();
            panelCurColor2.SuspendLayout();
            groupBox3.SuspendLayout();
            groupBox4.SuspendLayout();
            panelDrawingArea.SuspendLayout();
            tableLayoutPanel2.SuspendLayout();
            menuStrip1.SuspendLayout();
            panel2.SuspendLayout();
            panel5.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)trackBarCanvasSize).BeginInit();
            panelButtomLeft2.SuspendLayout();
            panelButtomLeft1.SuspendLayout();
            SuspendLayout();
            // 
            // btnPen
            // 
            btnPen.Image = Properties.Resources.qianbi2;
            btnPen.Location = new Point(6, 30);
            btnPen.Name = "btnPen";
            btnPen.Size = new Size(54, 50);
            btnPen.TabIndex = 0;
            btnPen.UseVisualStyleBackColor = true;
            btnPen.Click += BtnStartDrawing_Click;
            // 
            // btnPigmentBucket
            // 
            btnPigmentBucket.Image = (Image)resources.GetObject("btnPigmentBucket.Image");
            btnPigmentBucket.Location = new Point(80, 30);
            btnPigmentBucket.Name = "btnPigmentBucket";
            btnPigmentBucket.Size = new Size(54, 50);
            btnPigmentBucket.TabIndex = 1;
            btnPigmentBucket.UseVisualStyleBackColor = true;
            btnPigmentBucket.Click += button2_Click;
            // 
            // button3
            // 
            button3.Image = (Image)resources.GetObject("button3.Image");
            button3.Location = new Point(151, 30);
            button3.Name = "button3";
            button3.Size = new Size(54, 50);
            button3.TabIndex = 2;
            button3.UseVisualStyleBackColor = true;
            button3.Click += button3_Click;
            // 
            // btnEraser
            // 
            btnEraser.Image = (Image)resources.GetObject("btnEraser.Image");
            btnEraser.Location = new Point(6, 88);
            btnEraser.Name = "btnEraser";
            btnEraser.Size = new Size(54, 50);
            btnEraser.TabIndex = 3;
            btnEraser.UseVisualStyleBackColor = true;
            btnEraser.Click += BtnEraser_Click;
            // 
            // btnColorExtractor
            // 
            btnColorExtractor.Image = (Image)resources.GetObject("btnColorExtractor.Image");
            btnColorExtractor.Location = new Point(80, 88);
            btnColorExtractor.Name = "btnColorExtractor";
            btnColorExtractor.Size = new Size(54, 50);
            btnColorExtractor.TabIndex = 4;
            btnColorExtractor.UseVisualStyleBackColor = true;
            btnColorExtractor.Click += btnColorExtractor_Click;
            // 
            // button6
            // 
            button6.Image = Properties.Resources.fangdajing1;
            button6.Location = new Point(151, 88);
            button6.Name = "button6";
            button6.Size = new Size(54, 50);
            button6.TabIndex = 5;
            button6.UseVisualStyleBackColor = true;
            button6.Click += button6_Click;
            // 
            // trackBarWidth
            // 
            trackBarWidth.BackColor = Color.FromArgb(192, 192, 255);
            trackBarWidth.Location = new Point(3, 37);
            trackBarWidth.Name = "trackBarWidth";
            trackBarWidth.Orientation = Orientation.Vertical;
            trackBarWidth.Size = new Size(33, 264);
            trackBarWidth.TabIndex = 8;
            trackBarWidth.Scroll += TrackBarWidth_Scroll;
            // 
            // pictureBox1
            // 
            pictureBox1.BackColor = Color.FromArgb(192, 192, 255);
            pictureBox1.Image = (Image)resources.GetObject("pictureBox1.Image");
            pictureBox1.Location = new Point(3, 3);
            pictureBox1.Name = "pictureBox1";
            pictureBox1.Size = new Size(31, 28);
            pictureBox1.TabIndex = 9;
            pictureBox1.TabStop = false;
            // 
            // tableLayoutPanel1
            // 
            tableLayoutPanel1.ColumnCount = 6;
            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 22.58F));
            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 14.29F));
            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 21.29F));
            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 24.29F));
            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 14.29F));
            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 3.29F));
            tableLayoutPanel1.Controls.Add(groupBox1, 1, 0);
            tableLayoutPanel1.Controls.Add(groupBox2, 2, 0);
            tableLayoutPanel1.Controls.Add(panelColor, 3, 0);
            tableLayoutPanel1.Controls.Add(groupBox3, 0, 0);
            tableLayoutPanel1.Controls.Add(groupBox4, 4, 0);
            tableLayoutPanel1.Dock = DockStyle.Top;
            tableLayoutPanel1.Location = new Point(0, 32);
            tableLayoutPanel1.Name = "tableLayoutPanel1";
            tableLayoutPanel1.RowCount = 1;
            tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
            tableLayoutPanel1.Size = new Size(2046, 147);
            tableLayoutPanel1.TabIndex = 10;
            tableLayoutPanel1.Paint += tableLayoutPanel1_Paint_1;
            // 
            // groupBox1
            // 
            groupBox1.Controls.Add(button6);
            groupBox1.Controls.Add(btnEraser);
            groupBox1.Controls.Add(button3);
            groupBox1.Controls.Add(btnColorExtractor);
            groupBox1.Controls.Add(btnPen);
            groupBox1.Controls.Add(btnPigmentBucket);
            groupBox1.Location = new Point(464, 3);
            groupBox1.Name = "groupBox1";
            groupBox1.Size = new Size(216, 141);
            groupBox1.TabIndex = 6;
            groupBox1.TabStop = false;
            groupBox1.Text = "工具";
            // 
            // groupBox2
            // 
            groupBox2.BackColor = Color.FromArgb(192, 192, 255);
            groupBox2.Controls.Add(comboBox1);
            groupBox2.Controls.Add(btnDrawEllipse);
            groupBox2.Controls.Add(panel8);
            groupBox2.Controls.Add(btnDrawLine);
            groupBox2.Controls.Add(btnDrawDiamond);
            groupBox2.Controls.Add(btnDrawRectangle);
            groupBox2.Controls.Add(btnDrawTriangle);
            groupBox2.Controls.Add(btnDrawHexagon);
            groupBox2.Controls.Add(btnDrawPentagon);
            groupBox2.Controls.Add(btnDrawCircle);
            groupBox2.Location = new Point(756, 3);
            groupBox2.Name = "groupBox2";
            groupBox2.Size = new Size(429, 141);
            groupBox2.TabIndex = 7;
            groupBox2.TabStop = false;
            groupBox2.Text = "形状";
            // 
            // comboBox1
            // 
            comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
            comboBox1.FormattingEnabled = true;
            comboBox1.Location = new Point(286, 29);
            comboBox1.Name = "comboBox1";
            comboBox1.Size = new Size(120, 32);
            comboBox1.TabIndex = 8;
            comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
            // 
            // btnDrawEllipse
            // 
            btnDrawEllipse.Image = Properties.Resources.ellipse1;
            btnDrawEllipse.Location = new Point(30, 86);
            btnDrawEllipse.Name = "btnDrawEllipse";
            btnDrawEllipse.Size = new Size(52, 40);
            btnDrawEllipse.TabIndex = 0;
            btnDrawEllipse.UseVisualStyleBackColor = true;
            btnDrawEllipse.Click += btnDrawEllipse_Click;
            // 
            // panel8
            // 
            panel8.BackColor = Color.Gray;
            panel8.Location = new Point(265, 18);
            panel8.Name = "panel8";
            panel8.Size = new Size(1, 116);
            panel8.TabIndex = 12;
            // 
            // btnDrawLine
            // 
            btnDrawLine.Image = Properties.Resources.line1;
            btnDrawLine.Location = new Point(30, 40);
            btnDrawLine.Name = "btnDrawLine";
            btnDrawLine.Size = new Size(52, 40);
            btnDrawLine.TabIndex = 2;
            btnDrawLine.UseVisualStyleBackColor = true;
            btnDrawLine.Click += btnDrawLine_Click;
            // 
            // btnDrawDiamond
            // 
            btnDrawDiamond.Image = Properties.Resources.tubiao1;
            btnDrawDiamond.Location = new Point(204, 86);
            btnDrawDiamond.Name = "btnDrawDiamond";
            btnDrawDiamond.Size = new Size(52, 40);
            btnDrawDiamond.TabIndex = 7;
            btnDrawDiamond.UseVisualStyleBackColor = true;
            btnDrawDiamond.Click += btnDrawDiamond_Click;
            // 
            // btnDrawRectangle
            // 
            btnDrawRectangle.Image = Properties.Resources.juxing1;
            btnDrawRectangle.Location = new Point(146, 40);
            btnDrawRectangle.Name = "btnDrawRectangle";
            btnDrawRectangle.Size = new Size(52, 40);
            btnDrawRectangle.TabIndex = 1;
            btnDrawRectangle.UseVisualStyleBackColor = true;
            // 
            // btnDrawTriangle
            // 
            btnDrawTriangle.Image = Properties.Resources.xingzhuang_sanjiaoxing1;
            btnDrawTriangle.Location = new Point(88, 40);
            btnDrawTriangle.Name = "btnDrawTriangle";
            btnDrawTriangle.Size = new Size(52, 40);
            btnDrawTriangle.TabIndex = 6;
            btnDrawTriangle.UseVisualStyleBackColor = true;
            btnDrawTriangle.Click += btnDrawTriangle_Click;
            // 
            // btnDrawHexagon
            // 
            btnDrawHexagon.Image = Properties.Resources.tx_liubianxing1;
            btnDrawHexagon.Location = new Point(146, 86);
            btnDrawHexagon.Name = "btnDrawHexagon";
            btnDrawHexagon.Size = new Size(52, 40);
            btnDrawHexagon.TabIndex = 5;
            btnDrawHexagon.UseVisualStyleBackColor = true;
            btnDrawHexagon.Click += btnDrawHexagon_Click;
            // 
            // btnDrawPentagon
            // 
            btnDrawPentagon.Image = Properties.Resources.pentagon_1;
            btnDrawPentagon.Location = new Point(88, 86);
            btnDrawPentagon.Name = "btnDrawPentagon";
            btnDrawPentagon.Size = new Size(52, 40);
            btnDrawPentagon.TabIndex = 3;
            btnDrawPentagon.UseVisualStyleBackColor = true;
            btnDrawPentagon.Click += btnDrawPentagon_Click;
            // 
            // btnDrawCircle
            // 
            btnDrawCircle.Image = Properties.Resources.radio_on1;
            btnDrawCircle.Location = new Point(204, 40);
            btnDrawCircle.Name = "btnDrawCircle";
            btnDrawCircle.Size = new Size(52, 40);
            btnDrawCircle.TabIndex = 4;
            btnDrawCircle.UseVisualStyleBackColor = true;
            btnDrawCircle.Click += btnDrawCircle_Click;
            // 
            // panelColor
            // 
            panelColor.BorderStyle = BorderStyle.FixedSingle;
            panelColor.Controls.Add(btnYellow);
            panelColor.Dock = DockStyle.Fill;
            panelColor.Location = new Point(1191, 3);
            panelColor.Name = "panelColor";
            panelColor.Size = new Size(490, 141);
            panelColor.TabIndex = 10;
            panelColor.Paint += panelColor_Paint;
            // 
            // btnYellow
            // 
            btnYellow.ColumnCount = 2;
            btnYellow.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25.2049179F));
            btnYellow.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 74.79508F));
            btnYellow.Controls.Add(label1, 1, 1);
            btnYellow.Controls.Add(tableLayoutPanel4, 2, 0);
            btnYellow.Controls.Add(panel1, 0, 1);
            btnYellow.Controls.Add(panel6, 0, 0);
            btnYellow.Dock = DockStyle.Fill;
            btnYellow.ForeColor = SystemColors.ControlText;
            btnYellow.Location = new Point(0, 0);
            btnYellow.Name = "btnYellow";
            btnYellow.RowCount = 2;
            btnYellow.RowStyles.Add(new RowStyle(SizeType.Percent, 63.3802834F));
            btnYellow.RowStyles.Add(new RowStyle(SizeType.Percent, 36.6197166F));
            btnYellow.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));
            btnYellow.Size = new Size(488, 139);
            btnYellow.TabIndex = 8;
            btnYellow.Paint += btnYellow_Paint;
            // 
            // label1
            // 
            label1.AutoSize = true;
            label1.Dock = DockStyle.Fill;
            label1.Location = new Point(126, 88);
            label1.Name = "label1";
            label1.Size = new Size(359, 51);
            label1.TabIndex = 0;
            label1.Text = "选择";
            label1.TextAlign = ContentAlignment.MiddleCenter;
            // 
            // tableLayoutPanel4
            // 
            tableLayoutPanel4.BackColor = Color.FromArgb(192, 192, 255);
            tableLayoutPanel4.ColumnCount = 5;
            tableLayoutPanel4.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
            tableLayoutPanel4.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
            tableLayoutPanel4.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
            tableLayoutPanel4.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
            tableLayoutPanel4.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
            tableLayoutPanel4.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 20F));
            tableLayoutPanel4.Controls.Add(rbtnBlack, 0, 0);
            tableLayoutPanel4.Controls.Add(rbtnWhite, 0, 1);
            tableLayoutPanel4.Controls.Add(rbtnGray, 1, 0);
            tableLayoutPanel4.Controls.Add(rbtnGreen, 1, 1);
            tableLayoutPanel4.Controls.Add(rbtnRed, 2, 0);
            tableLayoutPanel4.Controls.Add(rbtnLightBlue, 2, 1);
            tableLayoutPanel4.Controls.Add(rBtnOrange, 3, 0);
            tableLayoutPanel4.Controls.Add(rbtnBlue, 3, 1);
            tableLayoutPanel4.Controls.Add(rbtnYellow, 4, 0);
            tableLayoutPanel4.Controls.Add(rbtnPurple, 4, 1);
            tableLayoutPanel4.Location = new Point(126, 3);
            tableLayoutPanel4.Name = "tableLayoutPanel4";
            tableLayoutPanel4.RowCount = 2;
            tableLayoutPanel4.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
            tableLayoutPanel4.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
            tableLayoutPanel4.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));
            tableLayoutPanel4.Size = new Size(359, 82);
            tableLayoutPanel4.TabIndex = 2;
            tableLayoutPanel4.Paint += tableLayoutPanel4_Paint;
            // 
            // rbtnBlack
            // 
            rbtnBlack.BackColor = Color.Black;
            rbtnBlack.BorderColor = Color.White;
            rbtnBlack.Dock = DockStyle.Fill;
            rbtnBlack.FlatAppearance.BorderSize = 0;
            rbtnBlack.FlatStyle = FlatStyle.Flat;
            rbtnBlack.Location = new Point(3, 3);
            rbtnBlack.Name = "rbtnBlack";
            rbtnBlack.Size = new Size(35, 35);
            rbtnBlack.TabIndex = 0;
            rbtnBlack.UseVisualStyleBackColor = false;
            // 
            // rbtnWhite
            // 
            rbtnWhite.AutoSize = true;
            rbtnWhite.BackColor = Color.White;
            rbtnWhite.BorderColor = Color.White;
            rbtnWhite.Dock = DockStyle.Fill;
            rbtnWhite.FlatAppearance.BorderSize = 0;
            rbtnWhite.FlatStyle = FlatStyle.Flat;
            rbtnWhite.Location = new Point(3, 44);
            rbtnWhite.Name = "rbtnWhite";
            rbtnWhite.Size = new Size(35, 35);
            rbtnWhite.TabIndex = 1;
            rbtnWhite.UseVisualStyleBackColor = false;
            // 
            // rbtnGray
            // 
            rbtnGray.BackColor = Color.Silver;
            rbtnGray.BorderColor = Color.White;
            rbtnGray.Dock = DockStyle.Fill;
            rbtnGray.FlatAppearance.BorderSize = 0;
            rbtnGray.FlatStyle = FlatStyle.Flat;
            rbtnGray.Location = new Point(74, 3);
            rbtnGray.Name = "rbtnGray";
            rbtnGray.Size = new Size(35, 35);
            rbtnGray.TabIndex = 2;
            rbtnGray.UseVisualStyleBackColor = false;
            // 
            // rbtnGreen
            // 
            rbtnGreen.BackColor = Color.Lime;
            rbtnGreen.BorderColor = Color.White;
            rbtnGreen.Dock = DockStyle.Fill;
            rbtnGreen.FlatAppearance.BorderSize = 0;
            rbtnGreen.FlatStyle = FlatStyle.Flat;
            rbtnGreen.Location = new Point(74, 44);
            rbtnGreen.Name = "rbtnGreen";
            rbtnGreen.Size = new Size(35, 35);
            rbtnGreen.TabIndex = 3;
            rbtnGreen.UseVisualStyleBackColor = false;
            // 
            // rbtnRed
            // 
            rbtnRed.BackColor = Color.Red;
            rbtnRed.BorderColor = Color.White;
            rbtnRed.Dock = DockStyle.Fill;
            rbtnRed.FlatAppearance.BorderSize = 0;
            rbtnRed.FlatStyle = FlatStyle.Flat;
            rbtnRed.Location = new Point(145, 3);
            rbtnRed.Name = "rbtnRed";
            rbtnRed.Size = new Size(35, 35);
            rbtnRed.TabIndex = 4;
            rbtnRed.UseVisualStyleBackColor = false;
            // 
            // rbtnLightBlue
            // 
            rbtnLightBlue.BackColor = Color.Cyan;
            rbtnLightBlue.BorderColor = Color.White;
            rbtnLightBlue.Dock = DockStyle.Fill;
            rbtnLightBlue.FlatAppearance.BorderSize = 0;
            rbtnLightBlue.FlatStyle = FlatStyle.Flat;
            rbtnLightBlue.Location = new Point(145, 44);
            rbtnLightBlue.Name = "rbtnLightBlue";
            rbtnLightBlue.Size = new Size(35, 35);
            rbtnLightBlue.TabIndex = 5;
            rbtnLightBlue.UseVisualStyleBackColor = false;
            // 
            // rBtnOrange
            // 
            rBtnOrange.BackColor = Color.FromArgb(255, 128, 0);
            rBtnOrange.BorderColor = Color.White;
            rBtnOrange.Dock = DockStyle.Fill;
            rBtnOrange.FlatAppearance.BorderSize = 0;
            rBtnOrange.FlatStyle = FlatStyle.Flat;
            rBtnOrange.Location = new Point(216, 3);
            rBtnOrange.Name = "rBtnOrange";
            rBtnOrange.Size = new Size(35, 35);
            rBtnOrange.TabIndex = 6;
            rBtnOrange.UseVisualStyleBackColor = false;
            // 
            // rbtnBlue
            // 
            rbtnBlue.BackColor = Color.Blue;
            rbtnBlue.BorderColor = Color.White;
            rbtnBlue.Dock = DockStyle.Fill;
            rbtnBlue.FlatAppearance.BorderSize = 0;
            rbtnBlue.FlatStyle = FlatStyle.Flat;
            rbtnBlue.Location = new Point(216, 44);
            rbtnBlue.Name = "rbtnBlue";
            rbtnBlue.Size = new Size(35, 35);
            rbtnBlue.TabIndex = 7;
            rbtnBlue.UseVisualStyleBackColor = false;
            // 
            // rbtnYellow
            // 
            rbtnYellow.BackColor = Color.Yellow;
            rbtnYellow.BorderColor = Color.White;
            rbtnYellow.Dock = DockStyle.Fill;
            rbtnYellow.FlatAppearance.BorderSize = 0;
            rbtnYellow.FlatStyle = FlatStyle.Flat;
            rbtnYellow.Location = new Point(287, 3);
            rbtnYellow.Name = "rbtnYellow";
            rbtnYellow.Size = new Size(35, 35);
            rbtnYellow.TabIndex = 8;
            rbtnYellow.UseVisualStyleBackColor = false;
            // 
            // rbtnPurple
            // 
            rbtnPurple.BackColor = Color.Fuchsia;
            rbtnPurple.BorderColor = Color.White;
            rbtnPurple.Dock = DockStyle.Fill;
            rbtnPurple.FlatAppearance.BorderSize = 0;
            rbtnPurple.FlatStyle = FlatStyle.Flat;
            rbtnPurple.Location = new Point(287, 44);
            rbtnPurple.Name = "rbtnPurple";
            rbtnPurple.Size = new Size(35, 35);
            rbtnPurple.TabIndex = 9;
            rbtnPurple.UseVisualStyleBackColor = false;
            // 
            // panel1
            // 
            panel1.Controls.Add(btnSelectColor);
            panel1.Dock = DockStyle.Fill;
            panel1.Location = new Point(3, 91);
            panel1.Name = "panel1";
            panel1.Size = new Size(117, 45);
            panel1.TabIndex = 3;
            // 
            // btnSelectColor
            // 
            btnSelectColor.BackColor = Color.Transparent;
            btnSelectColor.BorderColor = Color.White;
            btnSelectColor.FlatAppearance.BorderSize = 0;
            btnSelectColor.FlatStyle = FlatStyle.Flat;
            btnSelectColor.Image = (Image)resources.GetObject("btnSelectColor.Image");
            btnSelectColor.Location = new Point(39, 1);
            btnSelectColor.Name = "btnSelectColor";
            btnSelectColor.Size = new Size(44, 44);
            btnSelectColor.TabIndex = 0;
            btnSelectColor.UseVisualStyleBackColor = false;
            btnSelectColor.Click += btnSelectColor_Click;
            // 
            // panel6
            // 
            panel6.Controls.Add(panel7);
            panel6.Controls.Add(tableLayoutPanel3);
            panel6.Location = new Point(3, 3);
            panel6.Name = "panel6";
            panel6.Size = new Size(117, 82);
            panel6.TabIndex = 4;
            // 
            // panel7
            // 
            panel7.BackColor = Color.Black;
            panel7.Dock = DockStyle.Right;
            panel7.Location = new Point(116, 0);
            panel7.Name = "panel7";
            panel7.Size = new Size(1, 82);
            panel7.TabIndex = 13;
            // 
            // tableLayoutPanel3
            // 
            tableLayoutPanel3.ColumnCount = 2;
            tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
            tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 49F));
            tableLayoutPanel3.Controls.Add(labelColor2, 0, 1);
            tableLayoutPanel3.Controls.Add(panelCurColor1, 1, 1);
            tableLayoutPanel3.Controls.Add(panelCurColor2, 1, 0);
            tableLayoutPanel3.Controls.Add(labelColor1, 0, 0);
            tableLayoutPanel3.Location = new Point(-3, 0);
            tableLayoutPanel3.Name = "tableLayoutPanel3";
            tableLayoutPanel3.RowCount = 2;
            tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
            tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
            tableLayoutPanel3.Size = new Size(123, 86);
            tableLayoutPanel3.TabIndex = 1;
            // 
            // labelColor2
            // 
            labelColor2.AutoSize = true;
            labelColor2.Dock = DockStyle.Fill;
            labelColor2.Location = new Point(3, 43);
            labelColor2.Name = "labelColor2";
            labelColor2.Size = new Size(68, 43);
            labelColor2.TabIndex = 12;
            labelColor2.Text = "颜色2:";
            labelColor2.TextAlign = ContentAlignment.MiddleCenter;
            // 
            // panelCurColor1
            // 
            panelCurColor1.Controls.Add(rbtnCurColor2);
            panelCurColor1.Location = new Point(77, 46);
            panelCurColor1.Name = "panelCurColor1";
            panelCurColor1.Size = new Size(37, 37);
            panelCurColor1.TabIndex = 0;
            // 
            // rbtnCurColor2
            // 
            rbtnCurColor2.AutoSize = true;
            rbtnCurColor2.BackColor = Color.FromArgb(255, 192, 255);
            rbtnCurColor2.BorderColor = Color.White;
            rbtnCurColor2.Dock = DockStyle.Fill;
            rbtnCurColor2.FlatAppearance.BorderSize = 0;
            rbtnCurColor2.FlatStyle = FlatStyle.Flat;
            rbtnCurColor2.Location = new Point(0, 0);
            rbtnCurColor2.Name = "rbtnCurColor2";
            rbtnCurColor2.Size = new Size(37, 37);
            rbtnCurColor2.TabIndex = 2;
            rbtnCurColor2.UseVisualStyleBackColor = false;
            rbtnCurColor2.Click += rbtnCurColor_Click2_Click;
            // 
            // panelCurColor2
            // 
            panelCurColor2.Controls.Add(rbtnCurColor);
            panelCurColor2.Location = new Point(77, 3);
            panelCurColor2.Name = "panelCurColor2";
            panelCurColor2.Size = new Size(37, 37);
            panelCurColor2.TabIndex = 1;
            // 
            // rbtnCurColor
            // 
            rbtnCurColor.BackColor = Color.Black;
            rbtnCurColor.BorderColor = Color.White;
            rbtnCurColor.Dock = DockStyle.Fill;
            rbtnCurColor.FlatAppearance.BorderSize = 0;
            rbtnCurColor.FlatStyle = FlatStyle.Flat;
            rbtnCurColor.Location = new Point(0, 0);
            rbtnCurColor.Name = "rbtnCurColor";
            rbtnCurColor.Size = new Size(37, 37);
            rbtnCurColor.TabIndex = 1;
            rbtnCurColor.UseVisualStyleBackColor = false;
            rbtnCurColor.Click += rbtnCurColor_Click;
            // 
            // labelColor1
            // 
            labelColor1.AutoSize = true;
            labelColor1.Dock = DockStyle.Fill;
            labelColor1.Location = new Point(3, 0);
            labelColor1.Name = "labelColor1";
            labelColor1.Size = new Size(68, 43);
            labelColor1.TabIndex = 11;
            labelColor1.Text = "颜色1:";
            labelColor1.TextAlign = ContentAlignment.MiddleCenter;
            labelColor1.Click += labelColor1_Click;
            // 
            // groupBox3
            // 
            groupBox3.Controls.Add(button5);
            groupBox3.Controls.Add(button2);
            groupBox3.Controls.Add(button1);
            groupBox3.Controls.Add(button4);
            groupBox3.Controls.Add(btnChangeOpacity);
            groupBox3.Controls.Add(btnWhiten);
            groupBox3.Controls.Add(btnLasso);
            groupBox3.Controls.Add(panelBoundaryLine);
            groupBox3.Dock = DockStyle.Left;
            groupBox3.Location = new Point(3, 3);
            groupBox3.Name = "groupBox3";
            groupBox3.Size = new Size(455, 141);
            groupBox3.TabIndex = 11;
            groupBox3.TabStop = false;
            groupBox3.Text = "套索";
            // 
            // button5
            // 
            button5.Image = (Image)resources.GetObject("button5.Image");
            button5.Location = new Point(364, 82);
            button5.Name = "button5";
            button5.Size = new Size(73, 43);
            button5.TabIndex = 14;
            button5.UseVisualStyleBackColor = true;
            button5.Click += button5_Click_1;
            // 
            // button2
            // 
            button2.Image = (Image)resources.GetObject("button2.Image");
            button2.Location = new Point(276, 83);
            button2.Name = "button2";
            button2.Size = new Size(73, 43);
            button2.TabIndex = 13;
            button2.UseVisualStyleBackColor = true;
            // 
            // button1
            // 
            button1.Image = (Image)resources.GetObject("button1.Image");
            button1.Location = new Point(364, 24);
            button1.Name = "button1";
            button1.Size = new Size(73, 43);
            button1.TabIndex = 12;
            button1.UseVisualStyleBackColor = true;
            button1.Click += button1_Click_2;
            // 
            // button4
            // 
            button4.Image = (Image)resources.GetObject("button4.Image");
            button4.Location = new Point(276, 24);
            button4.Name = "button4";
            button4.Size = new Size(73, 43);
            button4.TabIndex = 11;
            button4.UseVisualStyleBackColor = true;
            button4.Click += button4_Click_1;
            // 
            // btnChangeOpacity
            // 
            btnChangeOpacity.Image = (Image)resources.GetObject("btnChangeOpacity.Image");
            btnChangeOpacity.Location = new Point(159, 82);
            btnChangeOpacity.Name = "btnChangeOpacity";
            btnChangeOpacity.Size = new Size(80, 54);
            btnChangeOpacity.TabIndex = 2;
            btnChangeOpacity.UseVisualStyleBackColor = true;
            btnChangeOpacity.Click += btnChangeOpacity_Click;
            // 
            // btnWhiten
            // 
            btnWhiten.Image = (Image)resources.GetObject("btnWhiten.Image");
            btnWhiten.Location = new Point(159, 18);
            btnWhiten.Name = "btnWhiten";
            btnWhiten.Size = new Size(80, 54);
            btnWhiten.TabIndex = 1;
            btnWhiten.UseVisualStyleBackColor = true;
            btnWhiten.Click += btnWhiten_Click;
            // 
            // btnLasso
            // 
            btnLasso.BackColor = Color.White;
            btnLasso.Image = (Image)resources.GetObject("btnLasso.Image");
            btnLasso.Location = new Point(26, 40);
            btnLasso.Name = "btnLasso";
            btnLasso.Size = new Size(107, 74);
            btnLasso.TabIndex = 0;
            btnLasso.UseVisualStyleBackColor = false;
            btnLasso.Click += btnLasso_Click;
            // 
            // panelBoundaryLine
            // 
            panelBoundaryLine.BackColor = Color.Gray;
            panelBoundaryLine.Location = new Point(255, 18);
            panelBoundaryLine.Name = "panelBoundaryLine";
            panelBoundaryLine.Size = new Size(1, 116);
            panelBoundaryLine.TabIndex = 11;
            // 
            // groupBox4
            // 
            groupBox4.Controls.Add(panel10);
            groupBox4.Controls.Add(btnRedo);
            groupBox4.Controls.Add(btnUndo);
            groupBox4.Location = new Point(1687, 3);
            groupBox4.Name = "groupBox4";
            groupBox4.Size = new Size(250, 126);
            groupBox4.TabIndex = 12;
            groupBox4.TabStop = false;
            groupBox4.Text = "操作";
            // 
            // panel10
            // 
            panel10.BackColor = Color.Gray;
            panel10.Location = new Point(123, 24);
            panel10.Name = "panel10";
            panel10.Size = new Size(1, 88);
            panel10.TabIndex = 12;
            // 
            // btnRedo
            // 
            btnRedo.Image = (Image)resources.GetObject("btnRedo.Image");
            btnRedo.Location = new Point(146, 40);
            btnRedo.Name = "btnRedo";
            btnRedo.Size = new Size(96, 68);
            btnRedo.TabIndex = 1;
            btnRedo.UseVisualStyleBackColor = true;
            btnRedo.Click += BtnRedo_Click;
            // 
            // btnUndo
            // 
            btnUndo.Image = (Image)resources.GetObject("btnUndo.Image");
            btnUndo.Location = new Point(6, 40);
            btnUndo.Name = "btnUndo";
            btnUndo.Size = new Size(96, 68);
            btnUndo.TabIndex = 0;
            btnUndo.UseVisualStyleBackColor = true;
            btnUndo.Click += BtnUndo_Click;
            // 
            // roundButton11
            // 
            roundButton11.BackColor = Color.Transparent;
            roundButton11.BorderColor = Color.White;
            roundButton11.FlatStyle = FlatStyle.Flat;
            roundButton11.Location = new Point(0, 0);
            roundButton11.Name = "roundButton11";
            roundButton11.Size = new Size(75, 23);
            roundButton11.TabIndex = 0;
            roundButton11.UseVisualStyleBackColor = false;
            // 
            // panelDrawingArea
            // 
            panelDrawingArea.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
            panelDrawingArea.AutoScroll = true;
            panelDrawingArea.BackColor = Color.White;
            panelDrawingArea.Controls.Add(tableLayoutPanel2);
            panelDrawingArea.Location = new Point(0, 178);
            panelDrawingArea.Margin = new Padding(0, 32, 0, 0);
            panelDrawingArea.Name = "panelDrawingArea";
            panelDrawingArea.Size = new Size(2046, 1002);
            panelDrawingArea.TabIndex = 6;
            panelDrawingArea.Paint += panel1_Paint;
            // 
            // tableLayoutPanel2
            // 
            tableLayoutPanel2.ColumnCount = 1;
            tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
            tableLayoutPanel2.Controls.Add(trackBarWidth, 0, 1);
            tableLayoutPanel2.Controls.Add(pictureBox1, 0, 0);
            tableLayoutPanel2.Location = new Point(3, 214);
            tableLayoutPanel2.Name = "tableLayoutPanel2";
            tableLayoutPanel2.RowCount = 2;
            tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 11.43695F));
            tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 88.56305F));
            tableLayoutPanel2.Size = new Size(39, 304);
            tableLayoutPanel2.TabIndex = 10;
            // 
            // menuStrip1
            // 
            menuStrip1.ImageScalingSize = new Size(24, 24);
            menuStrip1.Items.AddRange(new ToolStripItem[] { 文件ToolStripMenuItem, 编辑ToolStripMenuItem, 查看ToolStripMenuItem, 保存ToolStripMenuItem });
            menuStrip1.Location = new Point(0, 0);
            menuStrip1.Name = "menuStrip1";
            menuStrip1.Size = new Size(2046, 32);
            menuStrip1.TabIndex = 11;
            menuStrip1.Text = "menuStrip1";
            menuStrip1.ItemClicked += menuStrip1_ItemClicked;
            // 
            // 文件ToolStripMenuItem
            // 
            文件ToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { 导入ToolStripMenuItem, 导出ToolStripMenuItem });
            文件ToolStripMenuItem.Name = "文件ToolStripMenuItem";
            文件ToolStripMenuItem.Size = new Size(84, 28);
            文件ToolStripMenuItem.Text = "文件(F)";
            // 
            // 导入ToolStripMenuItem
            // 
            导入ToolStripMenuItem.Name = "导入ToolStripMenuItem";
            导入ToolStripMenuItem.Size = new Size(251, 34);
            导入ToolStripMenuItem.Text = "打开文件  Ctrl+O";
            导入ToolStripMenuItem.Click += openFile;
            // 
            // 导出ToolStripMenuItem
            // 
            导出ToolStripMenuItem.Name = "导出ToolStripMenuItem";
            导出ToolStripMenuItem.Size = new Size(251, 34);
            导出ToolStripMenuItem.Text = "保存文件  Ctrl+S";
            导出ToolStripMenuItem.Click += saveFile;
            // 
            // 编辑ToolStripMenuItem
            // 
            编辑ToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { 复制ToolStripMenuItem, 剪切CtrlXToolStripMenuItem, 粘贴CtrlvToolStripMenuItem, 旋转ToolStripMenuItem });
            编辑ToolStripMenuItem.Name = "编辑ToolStripMenuItem";
            编辑ToolStripMenuItem.Size = new Size(62, 28);
            编辑ToolStripMenuItem.Text = "编辑";
            // 
            // 复制ToolStripMenuItem
            // 
            复制ToolStripMenuItem.Name = "复制ToolStripMenuItem";
            复制ToolStripMenuItem.Size = new Size(209, 34);
            复制ToolStripMenuItem.Text = "复制  Ctrl+c";
            // 
            // 剪切CtrlXToolStripMenuItem
            // 
            剪切CtrlXToolStripMenuItem.Name = "剪切CtrlXToolStripMenuItem";
            剪切CtrlXToolStripMenuItem.Size = new Size(209, 34);
            剪切CtrlXToolStripMenuItem.Text = "剪切 Ctrl+x";
            // 
            // 粘贴CtrlvToolStripMenuItem
            // 
            粘贴CtrlvToolStripMenuItem.Name = "粘贴CtrlvToolStripMenuItem";
            粘贴CtrlvToolStripMenuItem.Size = new Size(209, 34);
            粘贴CtrlvToolStripMenuItem.Text = "粘贴 Ctrl+v";
            // 
            // 旋转ToolStripMenuItem
            // 
            旋转ToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { 顺时针旋转90ToolStripMenuItem, 顺时针旋转180ToolStripMenuItem, 逆时针旋转90ToolStripMenuItem, 逆时针旋转180ToolStripMenuItem });
            旋转ToolStripMenuItem.Name = "旋转ToolStripMenuItem";
            旋转ToolStripMenuItem.Size = new Size(209, 34);
            旋转ToolStripMenuItem.Text = "旋转";
            // 
            // 顺时针旋转90ToolStripMenuItem
            // 
            顺时针旋转90ToolStripMenuItem.Name = "顺时针旋转90ToolStripMenuItem";
            顺时针旋转90ToolStripMenuItem.Size = new Size(240, 34);
            顺时针旋转90ToolStripMenuItem.Text = "顺时针旋转90°";
            // 
            // 顺时针旋转180ToolStripMenuItem
            // 
            顺时针旋转180ToolStripMenuItem.Name = "顺时针旋转180ToolStripMenuItem";
            顺时针旋转180ToolStripMenuItem.Size = new Size(240, 34);
            顺时针旋转180ToolStripMenuItem.Text = "顺时针旋转180°";
            // 
            // 逆时针旋转90ToolStripMenuItem
            // 
            逆时针旋转90ToolStripMenuItem.Name = "逆时针旋转90ToolStripMenuItem";
            逆时针旋转90ToolStripMenuItem.Size = new Size(240, 34);
            逆时针旋转90ToolStripMenuItem.Text = "逆时针旋转90°";
            // 
            // 逆时针旋转180ToolStripMenuItem
            // 
            逆时针旋转180ToolStripMenuItem.Name = "逆时针旋转180ToolStripMenuItem";
            逆时针旋转180ToolStripMenuItem.Size = new Size(240, 34);
            逆时针旋转180ToolStripMenuItem.Text = "逆时针旋转180°";
            // 
            // 查看ToolStripMenuItem
            // 
            查看ToolStripMenuItem.Name = "查看ToolStripMenuItem";
            查看ToolStripMenuItem.Size = new Size(62, 28);
            查看ToolStripMenuItem.Text = "查看";
            // 
            // 保存ToolStripMenuItem
            // 
            保存ToolStripMenuItem.Name = "保存ToolStripMenuItem";
            保存ToolStripMenuItem.Size = new Size(62, 28);
            保存ToolStripMenuItem.Text = "保存";
            // 
            // panel2
            // 
            panel2.BackColor = Color.FromArgb(192, 192, 255);
            panel2.Controls.Add(panel5);
            panel2.Controls.Add(panelButtomLeft2);
            panel2.Controls.Add(panelButtomLeft1);
            panel2.Dock = DockStyle.Bottom;
            panel2.Location = new Point(0, 1180);
            panel2.Name = "panel2";
            panel2.Size = new Size(2046, 65);
            panel2.TabIndex = 12;
            // 
            // panel5
            // 
            panel5.Controls.Add(buttonSizeFitWindow);
            panel5.Controls.Add(comboBoxCanvasSize);
            panel5.Controls.Add(trackBarCanvasSize);
            panel5.Controls.Add(btnBottomShrink);
            panel5.Controls.Add(btnBottomEnlarge);
            panel5.Dock = DockStyle.Right;
            panel5.Location = new Point(1116, 0);
            panel5.Name = "panel5";
            panel5.Size = new Size(930, 65);
            panel5.TabIndex = 1;
            panel5.Paint += panel5_Paint;
            // 
            // buttonSizeFitWindow
            // 
            buttonSizeFitWindow.BackgroundImage = (Image)resources.GetObject("buttonSizeFitWindow.BackgroundImage");
            buttonSizeFitWindow.Image = (Image)resources.GetObject("buttonSizeFitWindow.Image");
            buttonSizeFitWindow.Location = new Point(257, -1);
            buttonSizeFitWindow.Name = "buttonSizeFitWindow";
            buttonSizeFitWindow.Size = new Size(65, 65);
            buttonSizeFitWindow.TabIndex = 3;
            buttonSizeFitWindow.UseVisualStyleBackColor = true;
            buttonSizeFitWindow.Click += buttonSizeFitWindow_Click;
            // 
            // comboBoxCanvasSize
            // 
            comboBoxCanvasSize.FormattingEnabled = true;
            comboBoxCanvasSize.Location = new Point(341, 19);
            comboBoxCanvasSize.Name = "comboBoxCanvasSize";
            comboBoxCanvasSize.Size = new Size(86, 32);
            comboBoxCanvasSize.TabIndex = 2;
            comboBoxCanvasSize.SelectedIndexChanged += comboBoxCanvasSize_SelectedIndexChanged;
            // 
            // trackBarCanvasSize
            // 
            trackBarCanvasSize.Location = new Point(504, 23);
            trackBarCanvasSize.Name = "trackBarCanvasSize";
            trackBarCanvasSize.Size = new Size(333, 69);
            trackBarCanvasSize.TabIndex = 0;
            trackBarCanvasSize.Scroll += trackBarCanvasSize_Scroll;
            // 
            // btnBottomShrink
            // 
            btnBottomShrink.BackgroundImage = (Image)resources.GetObject("btnBottomShrink.BackgroundImage");
            btnBottomShrink.Image = (Image)resources.GetObject("btnBottomShrink.Image");
            btnBottomShrink.Location = new Point(433, -1);
            btnBottomShrink.Name = "btnBottomShrink";
            btnBottomShrink.Size = new Size(65, 65);
            btnBottomShrink.TabIndex = 1;
            btnBottomShrink.UseVisualStyleBackColor = true;
            btnBottomShrink.Click += btnBottomShrink_Click;
            // 
            // btnBottomEnlarge
            // 
            btnBottomEnlarge.BackColor = Color.Transparent;
            btnBottomEnlarge.BackgroundImage = (Image)resources.GetObject("btnBottomEnlarge.BackgroundImage");
            btnBottomEnlarge.Image = (Image)resources.GetObject("btnBottomEnlarge.Image");
            btnBottomEnlarge.Location = new Point(843, -1);
            btnBottomEnlarge.Name = "btnBottomEnlarge";
            btnBottomEnlarge.Size = new Size(65, 65);
            btnBottomEnlarge.TabIndex = 0;
            btnBottomEnlarge.UseVisualStyleBackColor = false;
            btnBottomEnlarge.Click += btnBottomEnlarge_Click;
            // 
            // panelButtomLeft2
            // 
            panelButtomLeft2.Controls.Add(panel4);
            panelButtomLeft2.Controls.Add(labelColorB);
            panelButtomLeft2.Controls.Add(panelB);
            panelButtomLeft2.Controls.Add(labelColorG);
            panelButtomLeft2.Controls.Add(label2);
            panelButtomLeft2.Controls.Add(labelColorR);
            panelButtomLeft2.Controls.Add(panelG);
            panelButtomLeft2.Controls.Add(panelR);
            panelButtomLeft2.Dock = DockStyle.Left;
            panelButtomLeft2.Location = new Point(429, 0);
            panelButtomLeft2.Name = "panelButtomLeft2";
            panelButtomLeft2.Size = new Size(594, 65);
            panelButtomLeft2.TabIndex = 2;
            // 
            // panel4
            // 
            panel4.BackColor = Color.Black;
            panel4.Location = new Point(590, 13);
            panel4.Name = "panel4";
            panel4.Size = new Size(2, 43);
            panel4.TabIndex = 1;
            // 
            // labelColorB
            // 
            labelColorB.Location = new Point(478, 17);
            labelColorB.Name = "labelColorB";
            labelColorB.Size = new Size(94, 34);
            labelColorB.TabIndex = 2;
            labelColorB.TextAlign = ContentAlignment.MiddleLeft;
            // 
            // panelB
            // 
            panelB.Location = new Point(432, 13);
            panelB.Name = "panelB";
            panelB.Size = new Size(40, 40);
            panelB.TabIndex = 5;
            // 
            // labelColorG
            // 
            labelColorG.Location = new Point(334, 17);
            labelColorG.Name = "labelColorG";
            labelColorG.Size = new Size(94, 34);
            labelColorG.TabIndex = 1;
            labelColorG.TextAlign = ContentAlignment.MiddleLeft;
            // 
            // label2
            // 
            label2.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Bold);
            label2.Location = new Point(0, 0);
            label2.Name = "label2";
            label2.Size = new Size(138, 65);
            label2.TabIndex = 2;
            label2.Text = "RGB:";
            label2.TextAlign = ContentAlignment.MiddleCenter;
            // 
            // labelColorR
            // 
            labelColorR.Location = new Point(190, 13);
            labelColorR.Name = "labelColorR";
            labelColorR.Size = new Size(94, 36);
            labelColorR.TabIndex = 0;
            labelColorR.TextAlign = ContentAlignment.MiddleLeft;
            // 
            // panelG
            // 
            panelG.Location = new Point(288, 13);
            panelG.Name = "panelG";
            panelG.Size = new Size(40, 40);
            panelG.TabIndex = 4;
            // 
            // panelR
            // 
            panelR.Location = new Point(144, 13);
            panelR.Name = "panelR";
            panelR.Size = new Size(40, 40);
            panelR.TabIndex = 3;
            // 
            // panelButtomLeft1
            // 
            panelButtomLeft1.Controls.Add(panel3);
            panelButtomLeft1.Controls.Add(labelYShow);
            panelButtomLeft1.Controls.Add(labelY);
            panelButtomLeft1.Controls.Add(labelXShow);
            panelButtomLeft1.Controls.Add(labelCoordinate);
            panelButtomLeft1.Controls.Add(labelX);
            panelButtomLeft1.Dock = DockStyle.Left;
            panelButtomLeft1.Location = new Point(0, 0);
            panelButtomLeft1.Name = "panelButtomLeft1";
            panelButtomLeft1.Size = new Size(429, 65);
            panelButtomLeft1.TabIndex = 1;
            panelButtomLeft1.Paint += panelButtomLeft1_Paint;
            // 
            // panel3
            // 
            panel3.BackColor = Color.Black;
            panel3.Location = new Point(425, 13);
            panel3.Name = "panel3";
            panel3.Size = new Size(2, 43);
            panel3.TabIndex = 0;
            // 
            // labelYShow
            // 
            labelYShow.AutoSize = true;
            labelYShow.Location = new Point(258, 23);
            labelYShow.Name = "labelYShow";
            labelYShow.Size = new Size(0, 24);
            labelYShow.TabIndex = 4;
            labelYShow.TextAlign = ContentAlignment.MiddleLeft;
            // 
            // labelY
            // 
            labelY.AutoSize = true;
            labelY.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
            labelY.Location = new Point(232, 23);
            labelY.Name = "labelY";
            labelY.Size = new Size(25, 24);
            labelY.TabIndex = 3;
            labelY.Text = "Y:";
            labelY.TextAlign = ContentAlignment.MiddleCenter;
            labelY.Click += labelY_Click;
            // 
            // labelXShow
            // 
            labelXShow.AutoSize = true;
            labelXShow.Location = new Point(136, 23);
            labelXShow.Name = "labelXShow";
            labelXShow.Size = new Size(0, 24);
            labelXShow.TabIndex = 2;
            labelXShow.TextAlign = ContentAlignment.MiddleLeft;
            // 
            // labelCoordinate
            // 
            labelCoordinate.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Bold);
            labelCoordinate.Location = new Point(0, 0);
            labelCoordinate.Name = "labelCoordinate";
            labelCoordinate.Size = new Size(101, 65);
            labelCoordinate.TabIndex = 0;
            labelCoordinate.Text = "坐标:";
            labelCoordinate.TextAlign = ContentAlignment.MiddleCenter;
            labelCoordinate.Click += labelCoordinate_Click;
            // 
            // labelX
            // 
            labelX.AutoSize = true;
            labelX.Location = new Point(107, 23);
            labelX.Name = "labelX";
            labelX.Size = new Size(26, 24);
            labelX.TabIndex = 1;
            labelX.Text = "X:";
            labelX.TextAlign = ContentAlignment.MiddleCenter;
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(11F, 24F);
            AutoScaleMode = AutoScaleMode.Font;
            BackColor = Color.FromArgb(192, 192, 255);
            ClientSize = new Size(2046, 1245);
            Controls.Add(panel2);
            Controls.Add(panelDrawingArea);
            Controls.Add(tableLayoutPanel1);
            Controls.Add(menuStrip1);
            DoubleBuffered = true;
            Icon = (Icon)resources.GetObject("$this.Icon");
            KeyPreview = true;
            MainMenuStrip = menuStrip1;
            Name = "Form1";
            StartPosition = FormStartPosition.CenterParent;
            Text = "画图板";
            Load += Form1_Load;
            KeyDown += Form1_KeyDown;
            ((System.ComponentModel.ISupportInitialize)trackBarWidth).EndInit();
            ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
            tableLayoutPanel1.ResumeLayout(false);
            groupBox1.ResumeLayout(false);
            groupBox2.ResumeLayout(false);
            panelColor.ResumeLayout(false);
            btnYellow.ResumeLayout(false);
            btnYellow.PerformLayout();
            tableLayoutPanel4.ResumeLayout(false);
            tableLayoutPanel4.PerformLayout();
            panel1.ResumeLayout(false);
            panel6.ResumeLayout(false);
            tableLayoutPanel3.ResumeLayout(false);
            tableLayoutPanel3.PerformLayout();
            panelCurColor1.ResumeLayout(false);
            panelCurColor1.PerformLayout();
            panelCurColor2.ResumeLayout(false);
            groupBox3.ResumeLayout(false);
            groupBox4.ResumeLayout(false);
            panelDrawingArea.ResumeLayout(false);
            tableLayoutPanel2.ResumeLayout(false);
            tableLayoutPanel2.PerformLayout();
            menuStrip1.ResumeLayout(false);
            menuStrip1.PerformLayout();
            panel2.ResumeLayout(false);
            panel5.ResumeLayout(false);
            panel5.PerformLayout();
            ((System.ComponentModel.ISupportInitialize)trackBarCanvasSize).EndInit();
            panelButtomLeft2.ResumeLayout(false);
            panelButtomLeft1.ResumeLayout(false);
            panelButtomLeft1.PerformLayout();
            ResumeLayout(false);
            PerformLayout();
        }

        #endregion

        private Button btnPen;
        private Button btnPigmentBucket;
        private Button button3;
        private Button btnEraser;
        private Button btnColorExtractor;
        private Button button6;
        private TrackBar trackBarWidth;
        private TableLayoutPanel tableLayoutPanel1;
        private GroupBox groupBox1;
        private GroupBox groupBox2;
        private Button btnDrawRectangle;
        private Button btnDrawEllipse;
        private Button btnDrawDiamond;
        private Button btnDrawTriangle;
        private Button btnDrawHexagon;
        private Button btnDrawCircle;
        private Button btnDrawPentagon;
        private Button btnDrawLine;
        private ComboBox comboBox1;
        private TableLayoutPanel btnYellow;
        private Label label1;
        private ColorDialog colorDialog1;
        private TableLayoutPanel tableLayoutPanel3;
        private RoundButton rbtnCurColor;
        private RoundButton rbtnCurColor2;
        private TableLayoutPanel tableLayoutPanel4;
        private Panel panelCurColor1;
        private Panel panelCurColor2;
        private RoundButton rbtnBlack;
        private RoundButton rbtnWhite;
        private RoundButton rbtnGray;
        private RoundButton rbtnGreen;
        private RoundButton rbtnRed;
        private RoundButton rbtnLightBlue;
        private RoundButton rBtnOrange;
        private RoundButton rbtnBlue;
        private RoundButton rbtnYellow;
        private RoundButton rbtnPurple;
        private RoundButton roundButton11;
        private Panel panelDrawingArea;
        private RoundButton btnSelectColor;
        private Panel panel1;
        private Panel panelColor;
        private MenuStrip menuStrip1;
        private ToolStripMenuItem 文件ToolStripMenuItem;
        private ToolStripMenuItem 导入ToolStripMenuItem;
        private ToolStripMenuItem 导出ToolStripMenuItem;
        private ToolStripMenuItem 编辑ToolStripMenuItem;
        private ToolStripMenuItem 查看ToolStripMenuItem;
        private ToolStripMenuItem 保存ToolStripMenuItem;
        private GroupBox groupBox3;
        private Button btnLasso;
        private Button btnUndo;
        private GroupBox groupBox4;
        private Button btnRedo;
        private PictureBox pictureBox1;
        private Panel panel2;
        private Label labelX;
        private Label labelCoordinate;
        private Panel panelButtomLeft1;
        private Label labelXShow;
        private Label labelY;
        private Label labelYShow;
        private Label label2;
        private Panel panelButtomLeft2;
        private Panel panelB;
        private Panel panelG;
        private Panel panelR;
        private Label labelColorB;
        private Label labelColorG;
        private Label labelColorR;
        private Panel panel3;
        private Panel panel4;
        private Panel panel5;
        private Button btnBottomEnlarge;
        private Button btnBottomShrink;
        private TrackBar trackBarCanvasSize;
        private Button buttonSizeFitWindow;
        private ComboBox comboBoxCanvasSize;
        private TableLayoutPanel tableLayoutPanel2;
        private Panel panelBoundaryLine;
        private Button btnChangeOpacity;
        private Button btnWhiten;
        private Panel panel8;
        private Panel panel10;
        private Panel panel6;
        private Panel panel7;
        private Label labelColor1;
        private Label labelColor2;
        private Button button4;
        private Button button5;
        private Button button2;
        private Button button1;
        private ToolStripMenuItem 复制ToolStripMenuItem;
        private ToolStripMenuItem 剪切CtrlXToolStripMenuItem;
        private ToolStripMenuItem 粘贴CtrlvToolStripMenuItem;
        private ToolStripMenuItem 旋转ToolStripMenuItem;
        private ToolStripMenuItem 顺时针旋转90ToolStripMenuItem;
        private ToolStripMenuItem 顺时针旋转180ToolStripMenuItem;
        private ToolStripMenuItem 逆时针旋转90ToolStripMenuItem;
        private ToolStripMenuItem 逆时针旋转180ToolStripMenuItem;
    }
}

 二. 绘制图形

 代码:

        private void Panel1_MouseUp(object sender, MouseEventArgs e)
        {
            if (_choicePen)
            {
                _isDrawing = false;
                startPoint = null;
            }
            else if (_choiceEraser)
            {
                _isErasing = false;
                startPoint = null;
            }
            else if (_isDraging)
            {
                if (e.Button == MouseButtons.Left && startPoint.HasValue) // 左键释放  
                {

                    using (Graphics g = Graphics.FromImage(canvas))
                    {
                        // 画笔和画刷设置  
                        Pen pen = new Pen(rbtnCurColor.BackColor, shapeWidth);
                        SolidBrush brush = new SolidBrush(rbtnCurColor2.BackColor);
                        // 根据当前选择的形状类型进行绘制  
                        switch (shapeType)
                        {
                            case ShapeType.Line:
                                g.DrawLine(pen, startPoint.Value, endPoint.Value); // 绘制直线  
                                break;
                            case ShapeType.Triangle:
                                DrawEquilateralTriangle(g, pen, brush, startPoint.Value, endPoint.Value);
                                break;
                            case ShapeType.Rectangle:
                                var rect = GetRectangleFromPoints(startPoint.Value, endPoint.Value); // 获取矩形区域  
                                g.DrawRectangle(pen, rect); // 绘制矩形  
                                break;
                            case ShapeType.Circle:
                                DrawCircle(g, pen, brush, startPoint.Value, endPoint.Value);
                                break;
                            case ShapeType.Ellipse:
                                DrawEllipse(g, pen, brush, startPoint.Value, endPoint.Value);
                                break;
                            case ShapeType.Pentagon:
                                DrawRegularPolygon(g, pen, brush, 5, startPoint.Value, endPoint.Value);
                                break;
                            case ShapeType.Hexagon:
                                DrawRegularPolygon(g, pen, brush, 6, startPoint.Value, endPoint.Value);
                                break;
                            case ShapeType.Diamond:
                                DrawDiamond(g, pen, brush, startPoint.Value, endPoint.Value);
                                break;
                            default:
                                break;
                        }
                        pen.Dispose();
                        brush.Dispose();
                    }
                    panelDrawingArea.Invalidate(); // 触发重绘  
                    startPoint = null; // 重置起点,以便绘制新的形状  
                }
            }
            else if (_choicePigmentbucket)
            {
                Color targetColor = canvas.GetPixel(e.X, e.Y); // 获取点击位置的颜色  
                FloodFillOptimized(canvas, e.Location, targetColor, rbtnCurColor.BackColor); // 填充为所选颜色
                panelDrawingArea.Invalidate(); // 触发重绘  
            }
            else if (_choiceColorExtractor)
            {
                rbtnCurColor.BackColor = canvas.GetPixel(e.X, e.Y);
            }
            else if (_choiceSelection)
            {
                if (startPoint.HasValue)
                {
                    endPoint = e.Location;
                    ApplySelectionEffects();
                    startPoint = null;
                    endPoint = null;
                    panelDrawingArea.Invalidate(); // 触发重绘  

                }
            }
        }







        private void panel1_Paint(object sender, PaintEventArgs e)
        {

            int width = (int)(canvas.Width * scaleFactor);
            int height = (int)(canvas.Height * scaleFactor);

            // 计算缩放后图像在Panel中的位置,以保持图像居中  
            int x = (panelDrawingArea.Width - width) / 2 + panelDrawingArea.AutoScrollPosition.X;
            int y = (panelDrawingArea.Height - height) / 2 + panelDrawingArea.AutoScrollPosition.Y;

            // 设置Panel的最小滚动区域以适应放大后的图像  
            panelDrawingArea.AutoScrollMinSize = new Size(
                (int)(canvas.Width * (1.0 + ((scaleFactor - 1.0) / 2.0))),
                (int)(canvas.Height * (1.0 + ((scaleFactor - 1.0) / 2.0)))
            );

            // 考虑滚动偏移量来绘制图像  
            e.Graphics.DrawImage(canvas, new Rectangle(x, y, width, height));

            if (_choiceSelection && selectStartPoint.HasValue && selectEndPoint.HasValue)
            {
                // 在工作图像上绘制选择矩形  
                e.Graphics.DrawRectangle(selectionPen,
                    Math.Min(selectStartPoint.Value.X, selectEndPoint.Value.X),
                    Math.Min(selectStartPoint.Value.Y, selectEndPoint.Value.Y),
                    Math.Abs(selectEndPoint.Value.X - selectStartPoint.Value.X),
                    Math.Abs(selectEndPoint.Value.Y - selectStartPoint.Value.Y)
                );
                // 根据起点和终点创建一个矩形区域  
                Rectangle selectionRectangle = new Rectangle(
                    Math.Min(selectStartPoint.Value.X, selectEndPoint.Value.X),
                    Math.Min(selectStartPoint.Value.Y, selectEndPoint.Value.Y),
                    Math.Abs(selectEndPoint.Value.X - selectStartPoint.Value.X),
                    Math.Abs(selectEndPoint.Value.Y - selectStartPoint.Value.Y)
                );
            }


            if (!startPoint.HasValue || !endPoint.HasValue) return; // 起点或终点无效时返回  

            if (_isDraging)
            {
                // 画笔和画刷设置  
                Pen pen = new Pen(rbtnCurColor.BackColor, shapeWidth);
                SolidBrush brush = new SolidBrush(rbtnCurColor2.BackColor); // 填充颜色
                                                                            // 根据当前选择的形状类型进行绘制  
                switch (shapeType)
                {
                    case ShapeType.Line:
                        e.Graphics.DrawLine(pen, startPoint.Value, endPoint.Value); // 绘制直线  
                        break;
                    case ShapeType.Triangle:
                        DrawEquilateralTriangle(e.Graphics, pen, brush, startPoint.Value, endPoint.Value);
                        break;
                    case ShapeType.Rectangle:
                        var rect = GetRectangleFromPoints(startPoint.Value, endPoint.Value); // 获取矩形区域  
                        e.Graphics.DrawRectangle(pen, rect); // 绘制矩形  
                        break;
                    case ShapeType.Circle:
                        DrawCircle(e.Graphics, pen, brush, startPoint.Value, endPoint.Value);
                        break;
                    case ShapeType.Ellipse:
                        DrawEllipse(e.Graphics, pen, brush, startPoint.Value, endPoint.Value);
                        break;
                    case ShapeType.Pentagon:
                        DrawRegularPolygon(e.Graphics, pen, brush, 5, startPoint.Value, endPoint.Value);
                        break;
                    case ShapeType.Hexagon:
                        DrawRegularPolygon(e.Graphics, pen, brush, 6, startPoint.Value, endPoint.Value);
                        break;
                    case ShapeType.Diamond:
                        DrawDiamond(e.Graphics, pen, brush, startPoint.Value, endPoint.Value);
                        break;
                    default:
                        break;


                }

                pen.Dispose();
                brush.Dispose();
            }
        }

        // 绘制等边三角形  
        private void DrawEquilateralTriangle(Graphics g, Pen pen, Brush brush, Point start, Point end)
        {
            // 计算等边三角形的高和边长  
            int sideLength = (int)Math.Sqrt(Math.Pow(end.X - start.X, 2) + Math.Pow(end.Y - start.Y, 2));
            Point top = new Point(start.X + sideLength / 2, start.Y - (int)(Math.Sqrt(3) / 2 * sideLength));
            Point[] points = { start, end, top };
            g.DrawPolygon(pen, points);
            g.FillPolygon(brush, points);
        }

        // 绘制圆形  
        private void DrawCircle(Graphics g, Pen pen, Brush brush, Point start, Point end)
        {
            int radius = (int)Math.Sqrt(Math.Pow(end.X - start.X, 2) + Math.Pow(end.Y - start.Y, 2)) / 2;
            int centerX = start.X + radius;
            int centerY = start.Y + radius;
            g.DrawEllipse(pen, centerX - radius, centerY - radius, 2 * radius, 2 * radius);
            g.FillEllipse(brush, centerX - radius, centerY - radius, 2 * radius, 2 * radius);
        }

        // 绘制椭圆形  
        private void DrawEllipse(Graphics g, Pen pen, Brush brush, Point start, Point end)
        {
            int width = Math.Abs(end.X - start.X);
            int height = Math.Abs(end.Y - start.Y);
            int left = Math.Min(start.X, end.X);
            int top = Math.Min(start.Y, end.Y);
            g.DrawEllipse(pen, left, top, width, height);
            g.FillEllipse(brush, left, top, width, height);
        }

        // 根据两个点获取矩形的位置和大小  
        private Rectangle GetRectangleFromPoints(Point p1, Point p2)
        {
            int x = Math.Min(p1.X, p2.X);
            int y = Math.Min(p1.Y, p2.Y);
            int width = Math.Abs(p1.X - p2.X);
            int height = Math.Abs(p1.Y - p2.Y);
            return new Rectangle(x, y, width, height);
        }

        // 绘制正多边形  
        private void DrawRegularPolygon(Graphics g, Pen pen, Brush brush, int sides, Point start, Point end)
        {
            // 假定start是中心点,end是多边形的一个顶点  
            int radius = (int)Math.Sqrt(Math.Pow(end.X - start.X, 2) + Math.Pow(end.Y - start.Y, 2));
            double angleIncrement = 2 * Math.PI / sides;
            PointF[] points = new PointF[sides];

            for (int i = 0; i < sides; i++)
            {
                double angle = i * angleIncrement;
                float x = (float)(start.X + radius * Math.Cos(angle));
                float y = (float)(start.Y + radius * Math.Sin(angle));
                points[i] = new PointF(x, y);
            }

            g.DrawPolygon(pen, points);
            g.FillPolygon(brush, points);
        }

        // 绘制菱形  
        private void DrawDiamond(Graphics g, Pen pen, Brush brush, Point start, Point end)
        {
            // 假定start是菱形的一个顶点,end是菱形的对角顶点  
            int width = Math.Abs(end.X - start.X);
            int height = Math.Abs(end.Y - start.Y);
            int left = Math.Min(start.X, end.X);
            int top = Math.Min(start.Y, end.Y);
            PointF[] points = {
             new PointF(left + width / 2, top),
             new PointF(left + width, top + height / 2),
             new PointF(left + width / 2, top + height),
             new PointF(left, top + height / 2)
             };

            g.DrawPolygon(pen, points);
            g.FillPolygon(brush, points);
        }

三. 修改颜色

主要代码:

        private void btnSelectColor_Click(object sender, EventArgs e)
        {
            // 显示颜色选择器对话框  
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                if (_choiceColorOne)
                {
                    // 用户选择了一种颜色,将该颜色设置为Panel的背景色  
                    rbtnCurColor.BackColor = colorDialog1.Color;
                }
                else
                {
                    rbtnCurColor2.BackColor = colorDialog1.Color;
                }
            }
        }

 四. 铅笔工具

主要代码:


   private void Panel1_MouseMove(object sender, MouseEventArgs e)
   {
       // 计算相对于绘图区域的偏移量:从 e.Position 中减去绘图区域(即缩放后的图像在面板上的位置)的左上角坐标(x, y)。得出一个相对于绘图区域的点
       int width = (int)(canvas.Width * scaleFactor);
       int height = (int)(canvas.Height * scaleFactor);
       int x = (panelDrawingArea.Width - width) / 2 + panelDrawingArea.AutoScrollPosition.X;
       int y = (panelDrawingArea.Height - height) / 2 + panelDrawingArea.AutoScrollPosition.Y;
       Point relativePosition = new Point(e.X - x, e.Y - y);
       //将相对位置转换为原始图像上的位置
       Point currentPoint = new Point((int)(relativePosition.X / scaleFactor), (int)(relativePosition.Y / scaleFactor));
       if (_isDrawing)



       {
           int circleRadius = trackBarWidth.Value / 2;


           // 使用SolidBrush和Pen对象进行绘制  
           using (SolidBrush brush = new SolidBrush(rbtnCurColor.BackColor))
           using (Pen pen = new Pen(brush, trackBarWidth.Value))
           {
               using (Graphics g = Graphics.FromImage(canvas))
               {
                   g.SmoothingMode = SmoothingMode.AntiAlias;

                   // 如果存在前一个点,则从前一个点到当前点绘制一个圆圈  
                   if (startPoint.HasValue)
                   {
                       // 计算两点间的距离,并根据需要调整圆圈的密度  
                       double distance = Math.Sqrt(Math.Pow(currentPoint.X - startPoint.Value.X, 2) + Math.Pow(currentPoint.Y - startPoint.Value.Y, 2));
                       int steps = (int)(distance / circleRadius); // 根据距离确定需要绘制的圆圈数量  
                       if (steps < 20) steps = 20; // 至少绘制一个圆圈  

                       // 在前一个点和当前点之间插值,绘制圆圈  
                       for (int i = 0; i <= steps; i++)
                       {
                           double t = (double)i / steps;
                           int x2 = (int)(startPoint.Value.X + (currentPoint.X - startPoint.Value.X) * t);
                           int y2 = (int)(startPoint.Value.Y + (currentPoint.Y - startPoint.Value.Y) * t);
                           g.FillEllipse(brush, x2 - circleRadius, y2 - circleRadius, 2 * circleRadius, 2 * circleRadius);
                       }
                   }

                   // 在当前位置也绘制一个圆圈,以确保路径的连续性  
                   g.FillEllipse(brush, currentPoint.X - circleRadius, currentPoint.Y - circleRadius, 2 * circleRadius, 2 * circleRadius);
               }

               // 更新画布显示  
               panelDrawingArea.Refresh();
           }
           // 更新前一个点的位置  
           startPoint = currentPoint;
       }
    
   }
      

 五. 颜料桶

 主要代码:

private void Panel1_MouseUp(object sender, MouseEventArgs e){
     Color targetColor = canvas.GetPixel(e.X, e.Y); // 获取点击位置的颜色  
                FloodFillOptimized(canvas, e.Location, targetColor,      rbtnCurColor.BackColor); // 填充为所选颜色
                panelDrawingArea.Invalidate(); // 触发重绘  

}           
  private unsafe void FloodFillOptimized(Bitmap bmp, Point pt, Color targetColor, Color replacementColor)
  {
      // 如果目标颜色和替换颜色相同,则不进行填充操作  
      if (targetColor.ToArgb() == replacementColor.ToArgb())
          return;

      // 锁定位图以进行直接内存操作,提高性能  
      BitmapData bmpData = bmp.LockBits(
          new Rectangle(0, 0, bmp.Width, bmp.Height), // 锁定整个位图区域  
          ImageLockMode.WriteOnly, // 只写模式  
          bmp.PixelFormat); // 使用位图的原始像素格式  

      try
      {
          // 计算每个像素占用的字节数  
          int bytesPerPixel = Bitmap.GetPixelFormatSize(bmp.PixelFormat) / 8;
          // 无需使用的变量,可以删除或注释掉 // int byteCount = bmpData.Stride * bmp.Height;  
          // 获取位图数据的首地址指针  
          byte* scan0 = (byte*)bmpData.Scan0;

          // 使用栈来存储待处理的像素点  
          Stack<Point> stack = new Stack<Point>();
          stack.Push(pt); // 将初始点压入栈中  

          // 循环处理栈中的像素点  
          while (stack.Count > 0)
          {
              Point p = stack.Pop(); // 弹出栈顶的像素点  

              // 计算当前像素点在位图数据中的字节位置  
              int position = p.Y * bmpData.Stride + p.X * bytesPerPixel;

              // 读取当前像素点的颜色(假设是24位RGB格式)  
              Color currentColor = Color.FromArgb(
                  scan0[position + 2], // R(红色分量)  
                  scan0[position + 1], // G(绿色分量)  
                  scan0[position]);    // B(蓝色分量)  

              // 如果当前像素点颜色与目标颜色不同,则跳过  
              if (currentColor.ToArgb() != targetColor.ToArgb())
                  continue;

              // 将当前像素点的颜色替换为替换颜色  
              scan0[position + 2] = replacementColor.R; // 设置红色分量  
              scan0[position + 1] = replacementColor.G; // 设置绿色分量  
              scan0[position] = replacementColor.B;    // 设置蓝色分量  

              // 将相邻的上下左右四个点压入栈中,以便后续处理  
              // 注意要检查相邻点是否在图像范围内  
              if (p.X > 0) stack.Push(new Point(p.X - 1, p.Y));      // 左  
              if (p.X < bmp.Width - 1) stack.Push(new Point(p.X + 1, p.Y));    // 右  
              if (p.Y > 0) stack.Push(new Point(p.X, p.Y - 1));     // 上  
              if (p.Y < bmp.Height - 1) stack.Push(new Point(p.X, p.Y + 1));    // 下  
          }
      }
      finally
      {
          // 无论是否发生异常,都要确保解锁位图数据区域,释放资源  
          bmp.UnlockBits(bmpData);
      }
  }

六. 橡皮擦

主要代码:

        private void Panel1_MouseMove(object sender, MouseEventArgs e)
        {
 else if (_isErasing)
 {
     int eraserRadius = eraserWidth / 2;

     using (Graphics g = Graphics.FromImage(canvas))
     {
         g.SmoothingMode = SmoothingMode.AntiAlias;
         using (SolidBrush eraserBrush = new SolidBrush(Color.White)) // 假设画布背景是白色  
         {
             if (startPoint.HasValue)
             {
                 // 计算两点间的距离  
                 double distance = Math.Sqrt(Math.Pow(currentPoint.X - startPoint.Value.X, 2) + Math.Pow(currentPoint.Y - startPoint.Value.Y, 2));
                 int steps = (int)(distance / eraserRadius);
                 if (steps < 5) steps = 5;

                 // 在前一个点和当前点之间插值,绘制橡皮擦  
                 for (int i = 0; i <= steps; i++)
                 {
                     double t = (double)i / steps;
                     int x2 = (int)(startPoint.Value.X + (currentPoint.X - startPoint.Value.X) * t);
                     int y2 = (int)(startPoint.Value.Y + (currentPoint.Y - startPoint.Value.Y) * t);
                     g.FillEllipse(eraserBrush, x2 - eraserRadius, y2 - eraserRadius, 2 * eraserRadius, 2 * eraserRadius);
                 }
             }

             // 在当前位置也绘制一个橡皮擦  
             g.FillEllipse(eraserBrush, currentPoint.X - eraserRadius, currentPoint.Y - eraserRadius, 2 * eraserRadius, 2 * eraserRadius);
         }
     }

     panelDrawingArea.Refresh();

     // 更新前一个点的位置  
     startPoint = currentPoint;
 }

}

七. 图像彩色 

主要代码:同二


八. 撤销 

主要代码:

        // 撤销操作栈,保存之前的绘图状态  
        private Stack<Bitmap> undoStack = new Stack<Bitmap>();
 private void BtnUndo_Click(object sender, EventArgs e)  // 撤销
        {
            if (undoStack.Count > 0)
            {

                redoStack.Push(canvas.Clone() as Bitmap);
                canvas = undoStack.Pop();
                panelDrawingArea.Invalidate(); // 触发重绘事件  
            }
        }

九. 重做

主要代码:

        // 重做操作栈,保存已撤销的绘图状态  
        private Stack<Bitmap> redoStack = new Stack<Bitmap>();        
    private void BtnRedo_Click(object sender, EventArgs e)  // 重做
        {
            if (redoStack.Count > 0)
            {
                undoStack.Push(canvas.Clone() as Bitmap);
                canvas = redoStack.Pop();
                panelDrawingArea.Invalidate(); // 触发重绘事件  
            }
        }

十. 文件保存 

主要代码:

        private void saveFile(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Title = "另存为";
            // 设置保存文件对话框的过滤器,以便用户可以选择不同的图像格式  
            saveFileDialog1.Filter = "JPEG Files (*.jpg)|*.jpg|BMP Files (*.bmp)|*.bmp|GIF Files (*.gif)|*.gif|PNG Files (*.png)|*.png";

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                if (saveFileDialog1.FileName != "")
                {
                    using (FileStream fs = (FileStream)saveFileDialog1.OpenFile())
                    {
                        switch (saveFileDialog1.FilterIndex)
                        {
                            case 1:
                                canvas.Save(fs, ImageFormat.Jpeg);
                                break;

                            case 2:
                                canvas.Save(fs, ImageFormat.Bmp);
                                break;

                            case 3:
                                canvas.Save(fs, ImageFormat.Gif);
                                break;

                            case 4:
                                canvas.Save(fs, ImageFormat.Png);
                                break;
                        }
                    }
                }
            }
        }

十一. 文件打开 

主要代码:

        private void openFile(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            // 设置打开文件对话框的过滤器,以便用户可以选择图像文件  
            openFileDialog1.Filter = "Image Files (*.bmp;*.jpg;*.jpeg;*.png;*.gif)|*.bmp;*.jpg;*.jpeg;*.png;*.gif";

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                if (File.Exists(openFileDialog1.FileName))
                {
                    try
                    {
                        // 从文件中加载图像到Bitmap对象  
                        canvas = new Bitmap(openFileDialog1.FileName);
                        panelDrawingArea.Invalidate();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("错误: " + ex.Message);
                    }
                }
            }
        }

十二. 套索操作(比较粗糙)

 主要代码:

            if (_choiceSelection && selectStartPoint.HasValue && selectEndPoint.HasValue)
            {
                // 在工作图像上绘制选择矩形  
                e.Graphics.DrawRectangle(selectionPen,
                    Math.Min(selectStartPoint.Value.X, selectEndPoint.Value.X),
                    Math.Min(selectStartPoint.Value.Y, selectEndPoint.Value.Y),
                    Math.Abs(selectEndPoint.Value.X - selectStartPoint.Value.X),
                    Math.Abs(selectEndPoint.Value.Y - selectStartPoint.Value.Y)
                );
                // 根据起点和终点创建一个矩形区域  
                Rectangle selectionRectangle = new Rectangle(
                    Math.Min(selectStartPoint.Value.X, selectEndPoint.Value.X),
                    Math.Min(selectStartPoint.Value.Y, selectEndPoint.Value.Y),
                    Math.Abs(selectEndPoint.Value.X - selectStartPoint.Value.X),
                    Math.Abs(selectEndPoint.Value.Y - selectStartPoint.Value.Y)
                );
            }

十三. 美白(由RGB更改实现)

 主要代码:

        private void btnWhiten_Click(object sender, EventArgs e)
        {
            MakeAreaWhiter(canvas, new Rectangle(
                    Math.Min(selectStartPoint.Value.X, selectEndPoint.Value.X),
                    Math.Min(selectStartPoint.Value.Y, selectEndPoint.Value.Y),
                    Math.Abs(selectEndPoint.Value.X - selectStartPoint.Value.X),
                    Math.Abs(selectEndPoint.Value.Y - selectStartPoint.Value.Y)
                ), 0.8f);


        }
        public void MakeAreaWhiter(Bitmap bitmap, Rectangle selectionRectangle, float whitenFactor)
        {
            // 增白因子应该在0到1之间,其中0表示不改变颜色,1表示完全变白  
            if (whitenFactor < 0 || whitenFactor > 1)
            {
                throw new ArgumentOutOfRangeException(nameof(whitenFactor), "增白因子必须在0到1之间");
            }

            BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
            int bytesPerPixel = Bitmap.GetPixelFormatSize(bitmap.PixelFormat) / 8;
            int byteCount = bmpData.Stride * bitmap.Height;
            byte[] pixels = new byte[byteCount];

            // 复制位图像素数据到数组中  
            Marshal.Copy(bmpData.Scan0, pixels, 0, byteCount);

            for (int y = selectionRectangle.Top; y < selectionRectangle.Bottom; y++)
            {
                for (int x = selectionRectangle.Left; x < selectionRectangle.Right; x++)
                {
                    int pixelIndex = (y * bmpData.Stride) + (x * bytesPerPixel);
                    if (pixelIndex + 2 < pixels.Length) // 确保不会越界,并且至少包含RGB通道  
                    {
                        // 增加RGB值,使图像变白  
                        pixels[pixelIndex] = (byte)Math.Min(255, pixels[pixelIndex] + (255 - pixels[pixelIndex]) * whitenFactor); // R  
                        pixels[pixelIndex + 1] = (byte)Math.Min(255, pixels[pixelIndex + 1] + (255 - pixels[pixelIndex + 1]) * whitenFactor); // G  
                        pixels[pixelIndex + 2] = (byte)Math.Min(255, pixels[pixelIndex + 2] + (255 - pixels[pixelIndex + 2]) * whitenFactor); // B  
                    }
                }
            }

            // 将修改后的数据复制回位图  
            Marshal.Copy(pixels, 0, bmpData.Scan0, byteCount);

            // 解锁位图资源  
            bitmap.UnlockBits(bmpData);
            panelDrawingArea.Invalidate(); // 重绘粘贴板以显示新图像  
        }

十四. 透明(由透明度变化实现):

主要代码:

        private void btnChangeOpacity_Click(object sender, EventArgs e)
        {
            MakeAreaTransparent(canvas, new Rectangle(
                    Math.Min(selectStartPoint.Value.X, selectEndPoint.Value.X),
                    Math.Min(selectStartPoint.Value.Y, selectEndPoint.Value.Y),
                    Math.Abs(selectEndPoint.Value.X - selectStartPoint.Value.X),
                    Math.Abs(selectEndPoint.Value.Y - selectStartPoint.Value.Y)
                ), 0.5f);
        }

        public void MakeAreaTransparent(Bitmap bitmap, Rectangle selectionRectangle, float transparencyFactor)
        {
            // 透明度因子应该在0到1之间,其中0表示完全透明,1表示不改变透明度  
            if (transparencyFactor < 0 || transparencyFactor > 1)
            {
                throw new ArgumentOutOfRangeException(nameof(transparencyFactor), "透明度因子必须在0到1之间");
            }

            BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
            int bytesPerPixel = Bitmap.GetPixelFormatSize(bitmap.PixelFormat) / 8;
            int byteCount = bmpData.Stride * bitmap.Height;
            byte[] pixels = new byte[byteCount];

            // 复制位图像素数据到数组中  
            Marshal.Copy(bmpData.Scan0, pixels, 0, byteCount);

            for (int y = selectionRectangle.Top; y < selectionRectangle.Bottom; y++)
            {
                for (int x = selectionRectangle.Left; x < selectionRectangle.Right; x++)
                {
                    int pixelIndex = (y * bmpData.Stride) + (x * bytesPerPixel);
                    if (pixelIndex + 3 < pixels.Length) // 确保不会越界,并且像素格式包含Alpha通道  
                    {
                        // 降低Alpha值,增加透明度  
                        pixels[pixelIndex + 3] = (byte)(pixels[pixelIndex + 3] * transparencyFactor);
                    }
                }
            }

            // 将修改后的数据复制回位图  
            Marshal.Copy(pixels, 0, bmpData.Scan0, byteCount);
            bitmap.UnlockBits(bmpData);
            panelDrawingArea.Invalidate(); // 重绘粘贴板以显示新图像  
        }

        // 选择区域并复制或剪切  
        private void CopyOrCutSelection(bool isCut)
        {
            if (selectStartPoint.HasValue && selectEndPoint.HasValue)
            {
                Rectangle selectionRectangle = new Rectangle(
                    Math.Min(selectStartPoint.Value.X, selectEndPoint.Value.X),
                    Math.Min(selectStartPoint.Value.Y, selectEndPoint.Value.Y),
                    Math.Abs(selectEndPoint.Value.X - selectStartPoint.Value.X),
                    Math.Abs(selectEndPoint.Value.Y - selectStartPoint.Value.Y)
                );
                canvasSelection = new Bitmap(selectionRectangle.Width, selectionRectangle.Height);
                if (isCut)
                {
                    MakeAreaWhiter(canvas, selectionRectangle, 1f);
                }
                panelDrawingArea.Invalidate(); // 重绘粘贴板以显示新图像  
            }
        }

十五. 源码分享 

链接:https://pan.baidu.com/s/1J7Xvmkw302LD8suN36kE2w?pwd=8700 
提取码:8700


 最后,

        希望文章对你有所帮助!

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

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

相关文章

ARM32开发——总线与时钟

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 APB总线时钟树时钟树 外部晶振内部晶振 在这个例子中&#xff0c;这条大街和巴士构成了一套系统&#xff0c;我们称之为AHB总线。 …

【数据结构】详解二叉树

文章目录 1.树的结构及概念1.1树的概念1.2树的相关结构概念1.3树的表示1.4树在实际中的应用 2.二叉树的结构及概念2.1二叉树的概念2.2特殊的二叉树2.2.1满二叉树2.2.2完全二叉树 2.3 二叉树的性质2.4二叉树的存储结构2.4.1顺序结构2.4.2链表结构 1.树的结构及概念 1.1树的概念…

乐观锁 or 悲观锁 你怎么选?

你有没有听过这样一句话&#xff1a;悲观者正确&#xff0c;乐观者成功​。那么今天我来分享下什么是乐观锁​和悲观锁。 乐观锁和悲观锁有什么区别&#xff0c;它们什么场景会用 乐观锁 乐观锁基于这样的假设&#xff1a;多个事务在同一时间对同一数据对象进行操作的可能性很…

三体中的冯诺依曼

你叫冯诺依曼&#xff0c;是一位科学家。你无法形容眼前的现态&#xff0c;你不知道下一次自己葬身火海会是多久&#xff0c;你也不知道会不会下一秒就会被冰封&#xff0c;你唯一知道的&#xff0c;就是自己那寥寥无几的科学知识&#xff0c;你可能会抱着他们终身&#xff0c;…

基于Android Studio记事本系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 具有登录&#xff0c;注册&#xff0c;记住密码&#xff0c;自动登录的功能&#xff1b; 可以新增记事本&#xff0c;编辑&#xff0c;删除记事本信息&#xff0c;同时可以设置主标题&#xff0c;内容&#xff0c;以及…

SpringBoot【1】集成 Druid

SpringBoot 集成 Druid 前言创建项目修改 pom.xml 文件添加配置文件开发 java 代码启动类 - DruidApplication配置文件-propertiesDruidConfigPropertyDruidMonitorProperty 配置文件-configDruidConfig 控制层DruidController 运行验证Druid 的监控应用程序 前言 JDK版本&…

【HarmonyOS - ArkTS - 状态管理】

概述 本文主要是从页面和应用级两个方面介绍了ArkTS中的状态管理的一些概念以及如何使用。可能本文比较粗略&#xff0c;细节化请前往官网(【状态管理】)学习&#xff0c;若有理解错误的地方&#xff0c;欢迎评论指正。 装饰器总览 由于下面会频繁提及到装饰器&#xff0c;所…

【CH32V305FBP6】调试入坑指南

1. 无法烧录程序 现象 MounRiver Studio WXH-LinkUtility 解决方法 前提&#xff1a;连接复位引脚 或者 2. 无法调试 main.c 与调试口冲突&#xff0c;注释后调试 // USART_Printf_Init(115200);

orin部署tensorrt、cuda、cudnn、pytorch、onnx

绝大部分参考https://blog.csdn.net/qq_41336087/article/details/129661850 非orin可以参考https://blog.csdn.net/JineD/article/details/131201121 报错显卡驱动安装535没法安装、原始是和l4t-cuda的部分文件冲突 Options marked [*] produce a lot of output - pipe it t…

三方语言中调用, Go Energy GUI编译的dll动态链接库CEF

如何在其它编程语言中调用energy编译的dll动态链接库&#xff0c;以使用CEF 或 LCL库 Energy是Go语言基于LCL CEF开发的跨平台GUI框架, 具有很容易使用CEF 和 LCL控件库 interface 便利 示例链接 正文 为方便起见使用 python 调用 go energy 编译的dll 准备 系统&#x…

使用compile_commands.json配置includePath环境,解决vscode中引入头文件处有波浪线的问题

通过编译时生成的 compile_commands.json 文件自动完成对 vscode 中头文件路径的配置&#xff0c;实现 vscode 中的代码的自动跳转。完成头文件路径配置后&#xff0c;可以避免代码头部导入头文件部分出现波浪线&#xff0c;警告说无法正确找到头文件。 步骤 需要在 vscode 中…

Linux--进程间通信(1)(匿名管道)

目录 1.了解进程通信 1.1进程为什么要通信 1.2 进程如何通信 1.3进程间通信的方式 2.管道 2.1管道的初步理解 2.2站在文件描述符的角度-进一步理解管道 2.3 管道的系统调用接口&#xff08;匿名管道&#xff09; 2.3.1介绍接口函数&#xff1a; 2.3.2编写一个管道的代…

windows系统配置dns加快访问github 实用教程一(图文保姆级教程)

第一步、打开网页 https://tool.lu/ip IP地址查询 - 在线工具 输入www.github.com 或者github.com 点击网页查询按钮, 获取对应github网站对应的ip 完整操作步骤如上图所示,可以很清晰的看到github网站的ip显示地区是美国也就是说该网站服务器是在国外, 这也就是为什么我们在…

IDEA 中导入脚手架后该如何处理?

MySQL数据库创建啥的&#xff0c;没啥要说的&#xff01;自行配置即可&#xff01; 1.pom.xml文件&#xff0c;右键&#xff0c;add Maven Project …………&#xff08;将其添加为Maven&#xff09;【下述截图没有add Maven Project 是因为目前已经是Maven了&#xff01;&…

redis 高可用及哨兵模式 @by_TWJ

目录 1. 高可用2. redis 哨兵模式3. 图文的方式让我们读懂这几个算法3.1. Raft算法 - 图文3.2. Paxos算法 - 图文3.3. 区别&#xff1a; 1. 高可用 在 Redis 中&#xff0c;实现 高可用 的技术主要包括 持久化、复制、哨兵 和 集群&#xff0c;下面简单说明它们的作用&#xf…

今日分享丨按场景定制界面

遇到问题 我们在写文档或者代码时&#xff0c;会遇到需要书写重复或者类似内容的情况。快捷的做法是&#xff1a;先复制粘贴此相似内容&#xff0c;再修改差异。那么开发人员在设计界面的时候&#xff0c;也会遇到同类型的界面有重复的特性&#xff0c;比如报销类型的单据&…

ArcGIS模型构建器实例:一键拓扑(附模型下载)

ArcGIS模型构建器特别适用于流程固定的工作流。 要素的拓扑处理就非常符合这一特点&#xff0c;一个要素的拓扑过程基本固定&#xff0c;但是每次拓扑都要来一轮操作就很烦&#xff0c;这正是模型构建器的用武之地。 下面以ArcGIS Pro为例介绍在模型构建器中的整个拓扑流程&a…

2024山软创新实训:软件系统架构

软件架构 本文着重介绍本应用&#xff1a;基于开源LLM的易学大模型软件系统的架构。在经过2个月的探索、选型、实验、开发后&#xff0c;我们团队终于把整个系统的各块拼图搭建了起来&#xff0c;现在剩下的是集成、评测、优化和部署的工作。 1. Distributed System 整个项目…

echarts 环形图

环形图封装成了一个组件 组件名diagran.vue <!--环形图--> <template><div classchartPreDonut refchartPreDonut></div> </template><script> import * as echarts from echarts export default {props: [option, unit, title, center, …

UE5 Cesium2 最新使用地理配准子关卡构造全球场景

参考官方最新教程&#xff1a;Building Global Scenes with Georeferenced Sublevels – Cesium 创建持久关卡&#xff08;主关卡&#xff09; 这里一般包含DynamicPawn、CesiumSunSky 和 Cesium World Terrain 全球场景通用的对象。子关卡的创立&#xff0c;官方教程分为了两…