使用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();}#endregionprivate 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


 最后,

        希望文章对你有所帮助!

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

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

相关文章

前端树形结构组件的设计与实现:以企查查、天眼查股权结构为例

摘要 随着信息化时代的不断发展&#xff0c;数据可视化在各行各业的应用越来越广泛。特别是在商业信息查询领域&#xff0c;如企查查、天眼查等平台&#xff0c;通过直观的数据展示方式&#xff0c;帮助用户快速理解复杂的商业关系。本文将以一个前端tree树形结构模版组件为例…

【算法】模拟算法——替换所有的问号(easy)

题解&#xff1a;替换所有的问好(模拟算法) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 纯模拟。从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;就⽤ a ~ z 的每⼀个字符去尝试替换即可。 3.参考代码 class Solution { pu…

使用docker部署项目

一、docker私有镜像仓库 1、docker私有镜像仓库 库&#xff08;Repository&#xff09;是集中存放镜像的地方&#xff0c;又分为公共镜像和私有仓库。 当我们执行docker pull xxx的时候&#xff0c;它实际上是从registry.docker.com这个地址去查找&#xff0c;这就是Docker公…

城市之旅:使用 LLM 和 Elasticsearch 简化地理空间搜索(二)

我们在之前的文章 “城市之旅&#xff1a;使用 LLM 和 Elasticsearch 简化地理空间搜索&#xff08;一&#xff09;”&#xff0c;在今天的练习中&#xff0c;我将使用本地部署来做那里面的 Jupyter notebook。 安装 Elasticsearch 及 Kibana 如果你还没有安装好自己的 Elasti…

EitbaseEX香港业务开展,提升用户友好交易体验

在全球范围内备受瞩目的加密货币交易平台Coinbase&#xff0c;宣布正式入驻香港市场&#xff0c;并命名为EitbaseEX。这一战略性扩展举措&#xff0c;旨在为香港提供先进的加密货币交易技术和服务&#xff0c;同时将香港打造为其在亚太地区的重要枢纽。 作为国际金融中心&#…

Nginx 文件下载 限速设置 限制访问频率 下载速率 并发连接数 简单实用教程

1 没有限速之前 2 nginx配置 #增加如下配置 limit_conn_zone $binary_remote_addr zoneaddr:10m; location / {limit_conn addr 1; #按照来源&#xff0c;限制每个IP 的连接数为1limit_rate_after 1000k;不限速下载的数据量limit_rate 100k; #限制最大传输速率root /data/log…

sudo命令的隐患-要注意安全使用!!严格管理!!严格控制

前言 众所周知&#xff0c;sudo命令非常方便&#xff0c;而且有一定的优点。比如不需要知道root密码就可以执行一些root的命令。相比于su 必须知道root密码来说&#xff0c;减少了root密码泄露的风险。 但是sudo也是一把非常锋利的双刃剑&#xff0c;需要加以限制&#xff0c;…

翻译《The Old New Thing》- What a drag: Dragging a virtual file (IStream edition)

What a drag: Dragging a virtual file (IStream edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080319-00/?p23073 Raymond Chen 2008年03月19日 拖拽虚拟文件&#xff08;IStream 版本&#xff09; 上一次&#xff0c;我们看…

python | 类的实现

和实例有关的&#xff0c;通过对象名&#xff0c;打点调用 实例属性&#xff0c;实例方法 stuStudent("XiaoMing",18) print(stu.name) 类属性、静态方法和类方法都是通过类名直接调用 Student.name 静态方法和类方法都不能调用实例属性和实例方法 动态绑定 如果是函…

深入分析 Android Service (四)

文章目录 深入分析 Android Service (四)1. 使用 Messenger 进行通信2. 详细示例&#xff1a;使用 Messenger 进行通信2.1 创建 MessengerService2.2 在 Activity 中绑定服务并发送消息 3. 使用 AIDL 进行进程间通信3.1 定义 AIDL 接口3.2 实现 AIDL 接口3.3 在客户端绑定 AIDL…

C语言序列化和反序列化--TPL中的API(三)

tpl_map 创建tpl的唯一方法是调用tpl_map()。第一个参数是格式字符串。后面是格式字符串中特定字符所需的参数列表。例如, tpl_node *tn; int i; tn tpl_map( "A(i)", &i );该函数在格式字符串中的项和给定地址的C程序变量之间创建映射。稍后&#xff0c;C变量…

自定义对象池BasePooledObjectFactory的使用

项目中用到了apache的对象池来管理文件导出相关资源连接和回收功能&#xff0c;因此花点时间简单了解下对象池相关使用&#xff0c;做点记录。 一. 连接池 频繁的建立和关闭连接&#xff0c;会极大的降低系统的性能&#xff0c;而连接池会在初始化的时候会创建一定数量的连接…

C++ | Leetcode C++题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();int buy1 -prices[0], sell1 0;int buy2 -prices[0], sell2 0;for (int i 1; i < n; i) {buy1 max(buy1, -prices[i]);sell1 max(…

FPGA高端项目:FPGA解码MIPI视频+图像缩放+视频拼接,基于MIPI CSI-2 RX Subsystem架构实现,提供4套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我这里已有的 MIPI 编解码方案本方案在Xilinx Artix7-35T上解码MIPI视频的应用本方案在Xilinx Artix7-100T上解码MIPI视频的应用本方案在Xilinx Kintex7上解码MIPI视频的应用本方案在Xilinx Zynq7000上解码MIPI视频的应用本方案在…

11.1 排序算法

目录 11.1 排序算法 11.1.1 评价维度 11.1.2 理想排序算法 11.1 排序算法 排序算法&#xff08;sorting algorithm&#xff09;用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用&#xff0c;因为有序数据通常能够被更高效地查找、分析和处理。 如图 1…

常用电机测试方法的介绍与功能实现(M测试方法)

目录 概述 1 常用电机测速方法简介 1.1 方法概览 1.2 编码器测速方法 2 M法测速 2.1 理论描述 2.2 实现原理 2.3 速度计算方法 3 功能实现 3.1 功能介绍 3.2 代码实现 3.2.1 使用STM32Cube配置参数 3.2.2 脉冲计数功能 3.2.3 测速函数 4 测试 概述 本文主要介绍…

黑马一站制造数仓实战2

问题 DG连接问题 原理&#xff1a;JDBC&#xff1a;用Java代码连接数据库 Hive/SparkSQL&#xff1a;端口有区别 可以为同一个端口&#xff0c;只要不在同一台机器 项目&#xff1a;一台机器 HiveServer&#xff1a;10000 hiveserver.port 10000 SparkSQL&#xff1a;10001…

一维时间序列信号的广义傅里叶族变换(Matlab)

广义傅里叶族变换是一种时频变换方法&#xff0c;傅里叶变换、短时傅里叶变换、S变换和许多小波变换都是其特殊情况&#xff0c;完整代码及子函数如下&#xff0c;很容易读懂&#xff1a; % Run a demo by creating a signal, transforming it, and plotting the results% Cre…

不同厂商SOC芯片在视频记录仪领域的应用

不同SoC公司芯片在不同产品上的应用信息&#xff1a; 大唐半导体 芯片型号: LC1860C (主控) LC1160 (PMU)产品应用: 红米2A (399元)大疆晓Spark技术规格: 28nm工艺&#xff0c;4个ARM Cortex-A7处理器&#xff0c;1.5GHz主频&#xff0c;2核MaliT628 GPU&#xff0c;1300万像…

计算属性与监听属性

【 1 】计算属性 计算属性大致就是这样 # 1 计算属性是基于它们的依赖进行缓存的# 2 计算属性只有在它的相关依赖发生改变时才会重新求值# 3 计算属性就像Python中的property&#xff0c;可以把方法/函数伪装成属性 # 计算属性本质上是一个函数&#xff0c;它们可以通过 get…