国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用c#實現(xiàn)一個簡單繪圖軟件(繪制矩形、多邊形,畫筆、橡皮擦功能)的完整教程

這篇具有很好參考價值的文章主要介紹了使用c#實現(xiàn)一個簡單繪圖軟件(繪制矩形、多邊形,畫筆、橡皮擦功能)的完整教程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

c#是微軟提供的用于開發(fā)windows軟件的開發(fā)語言,可以使用其快速的實現(xiàn)windows桌面軟件的開發(fā)。這里基于C#開發(fā)了一款簡單的繪圖軟件,可以用于繪制矩形、多邊形的繪制(基于這些可以實現(xiàn)自己的數(shù)據(jù)標注軟件),還實現(xiàn)了畫筆、橡皮擦功能。開發(fā)C#軟件通常使用Visual Studio軟件開發(fā),這里使用的是vs2019。

1、基本概念

使用c#實現(xiàn)繪圖軟件需要了解c#桌面軟件所具備的控件(如按鈕、文本框、進度條、下拉列表、圖片顯示控件等)和各種相關(guān)事件(如鼠標按下、鼠標拖動、控件點擊、控件重繪等事件)。

1.1 相關(guān)桌面控件介紹

開發(fā)繪圖軟件需要用到的桌面控件有:按鈕(Button)、文本框(Label)、下拉列表(ComboBox)、進度條(trackBar)、圖片顯示控件(PictureBox)等。博主使用以上控件實現(xiàn)了下圖的操作界面,這里需要補充的是博主使用button來顯示顏色(設置button的文本為空,然后修改了它的顏色),如果點擊該按鈕則會彈出顏色選擇框。
c#設計并完成“繪圖工具”功能,要求能夠通過鼠標點擊繪制直線、矩形等功能,python、C++與C#實踐,c#,開發(fā)語言,ui
除了上述的控件外,還有一些對話框,如顏色對話框(用于選擇顏色),文件選擇框(用于選擇文件)。

創(chuàng)建顏色對話框
ColorDialog cl = new ColorDialog();
            if (cl.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                fill_color = Color.FromArgb(cl.Color.A, cl.Color.R, cl.Color.G, cl.Color.B);
                btn_color.BackColor = fill_color;
                fill_brush = new SolidBrush(fill_color);
                line_color = new Pen(fill_brush);
            }

c#設計并完成“繪圖工具”功能,要求能夠通過鼠標點擊繪制直線、矩形等功能,python、C++與C#實踐,c#,開發(fā)語言,ui

創(chuàng)建文件選擇框
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Title = "請選擇圖片";
    ofd.Filter = "所有文件|*.*";
    ofd.InitialDirectory = @"C:\Users";
    ofd.Multiselect = false;
    if (ofd.ShowDialog() == DialogResult.OK)
    {
        string image_path = ofd.FileName;
        bg_image = Image.FromFile(image_path);
        bg_image = ImgUtils.resizeImg(bg_image, pictureBox1.Width, pictureBox1.Height);
        //tmp_bitmap.Save("finish.bmp");
        pictureBox1.Image = bg_image;
    }

c#設計并完成“繪圖工具”功能,要求能夠通過鼠標點擊繪制直線、矩形等功能,python、C++與C#實踐,c#,開發(fā)語言,ui

1.2 桌面控件相關(guān)事件

通過監(jiān)聽桌面控件的相關(guān)事件可以執(zhí)行相應的代碼流程,如點擊打開文件,則彈出文件選擇框,點擊設置顏色則彈出顏色選擇框,拖動進度條則改變畫筆和橡皮擦的大小等等。

button點擊事件

button通常是設置點擊事件(Click事件),在軟件設計界面雙擊特定按鈕即可轉(zhuǎn)到其點擊事件的編輯代碼。
c#設計并完成“繪圖工具”功能,要求能夠通過鼠標點擊繪制直線、矩形等功能,python、C++與C#實踐,c#,開發(fā)語言,ui
上圖中“載入底圖”按鈕是用于選擇圖片,并加載到繪圖框中,因此實現(xiàn)代碼如下:

private void btn_load_bg_Click(object sender, EventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Title = "請選擇圖片";
    ofd.Filter = "所有文件|*.*";
    ofd.InitialDirectory = @"C:\Users";
    ofd.Multiselect = false;
    if (ofd.ShowDialog() == DialogResult.OK)
    {
        string image_path = ofd.FileName;
        bg_image = Image.FromFile(image_path);
        bg_image = ImgUtils.resizeImg(bg_image, pictureBox1.Width, pictureBox1.Height);
        //tmp_bitmap.Save("finish.bmp");
        pictureBox1.Image = bg_image;
    }
}
ComboBox選項切換事件

ComboBox選項切換事件也就是SelectedIndexChanged事件,設置這個事件需要先選擇空間,然后點擊圖中標號為2的雷電符號(設置控件屬性),找到SelectedIndexChanged然后在其空白處(圖中綠色框處)雙擊,即可進入設置SelectedIndexChanged事件(獲取ComboBox所選中的文本,然后修改相關(guān)變量);。
c#設計并完成“繪圖工具”功能,要求能夠通過鼠標點擊繪制直線、矩形等功能,python、C++與C#實踐,c#,開發(fā)語言,ui
設置ComboBox的可選項需要先選中控件,然后單擊右鍵,彈出選擇框,接著點擊“編輯項”,即可進入以下界面。這里博主設置了5個選項,分別為:矩形(填充)、矩形、多邊形(填充)、多邊形、畫筆。
c#設計并完成“繪圖工具”功能,要求能夠通過鼠標點擊繪制直線、矩形等功能,python、C++與C#實踐,c#,開發(fā)語言,ui

TrackBar的拖動事件

trackBar的拖動事件也就是Scroll事件,依照下圖所點擊的順序,找到Scroll雙擊即可設置拖動事件(獲取trackBar表示的數(shù)值,然后修改相關(guān)變量);
c#設計并完成“繪圖工具”功能,要求能夠通過鼠標點擊繪制直線、矩形等功能,python、C++與C#實踐,c#,開發(fā)語言,ui

1.3 桌面控件通用事件

除了博主在上面描述的控件專用事件,針對桌面控件還有一些通用事件,如:鼠標按下(MouseDown)、鼠標移動(MouseMove)、鼠標松開(MouseUp)、控件重繪(Paint)等。在這里開發(fā)繪圖軟件,主要監(jiān)聽pictureBox的鼠標按下、鼠標移動、鼠標松開、控件重繪事件,設置這些事件同樣需要在設計界面選擇空間然后找到對應的事件進行雙擊。

其中,鼠標按下、鼠標移動、鼠標松開等事件,還可以是函數(shù)內(nèi)部獲取鼠標的位置、鼠標按下的按鈕(鼠標左鍵或鼠標右鍵)。因為,不同的按鈕按下可以不同的事件需求;此外,通過這些事件的組合,可以完成一下復雜的操作,如拖動(鼠標按下時設置press=true,鼠標移動且press=true既為拖動,鼠標松開時設置press=false);

這里有一個不一樣的就是控件重繪事件,控件重繪事件無法被用戶激發(fā),只能被代碼激活,如pictureBox1的重繪事件需要顯性的調(diào)用pictureBox1.Invalidate()才能激發(fā)。這主要用戶鼠標位置的繪制,同樣也可以繪制特定形狀是鼠標拖動過程中的參考線。

2、軟件實現(xiàn)

2.1 軟件布局

軟件的界面設置如下所示,通過下拉框選擇繪圖功能,通過顏色按鈕選擇要繪圖的顏色,通過拖動條設置橡皮擦和畫筆的大小。
c#設計并完成“繪圖工具”功能,要求能夠通過鼠標點擊繪制直線、矩形等功能,python、C++與C#實踐,c#,開發(fā)語言,ui
上面控件的定義代碼如下所示

this.btn_load_bg = new System.Windows.Forms.Button();
this.btn_eraser = new System.Windows.Forms.Button();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.btn_color = new System.Windows.Forms.Button();
this.trackBar1 = new System.Windows.Forms.TrackBar();//定義拖動條
this.label2 = new System.Windows.Forms.Label();
this.lab_line_width = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();

2.2 變量定義

這里定義了一些繪圖顏色、線寬相關(guān)的變量

private int line_width = 10;//劃線的寬度設置為10
private Color fill_color = Color.Black;//繪圖區(qū)域的背景顏色
private SolidBrush fill_brush = new SolidBrush(Color.Black);
private Pen line_color = new Pen(new SolidBrush(Color.Black));
private SolidBrush eraser_brush = new SolidBrush(Color.Transparent);//橡皮擦顏色

這里定義了一些繪圖過程需要的變量

private Graphics draw_paint, merge_paint;//中間畫板
private Image tmp_bitmap;//用來保存繪圖痕跡

List<Point> polyPoints = null;//存儲繪制多邊形的點集
Rectangle rectA;//存儲要用于繪圖的矩形
Image bg_image;//背景圖片
Point start;  //起始點
Point end;   //結(jié)束點

這里定義了一些繪圖判別相關(guān)的變量

bool need_draw_tmp;   //在MouseMove事件中判斷是否繪制矩形框
string action_type = "";//繪圖動作類型
bool is_first_down = true;//判斷是否第一次按下鼠標
bool press_move_flag = true;

2.3 事件綁定

完整的變量定義和事件綁定代碼如下所示,其核心在于區(qū)分開pictureBox的鼠標按下(MouseDown)、鼠標移動(MouseMove)、鼠標松開(MouseUp)、控件重繪(Paint)事件在不同的繪圖動作類型(action_type )的實現(xiàn)代碼。所以,代碼中if用的比較多。其中控件重繪(Paint)事件在繪制矩形、多邊形時用于繪制對應的參考線,在畫筆和橡皮擦功能時用于繪制鼠標對應的點。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Windows.Forms;

namespace 繪畫識別
{
    public partial class Form1 : Form
    {
        private int line_width = 10;//劃線的寬度設置為10
        private Color fill_color = Color.Black;//繪圖區(qū)域的背景顏色
        private SolidBrush fill_brush = new SolidBrush(Color.Black);
        private Pen line_color = new Pen(new SolidBrush(Color.Black));
        private SolidBrush eraser_brush = new SolidBrush(Color.Transparent);//橡皮擦顏色

        private Graphics draw_paint, merge_paint;//中間畫板
        private Image tmp_bitmap;//用來保存繪圖痕跡

        List<Point> polyPoints = null;//存儲繪制多邊形的點集
        Rectangle rectA;//存儲要用于繪圖的矩形
        Image bg_image;//背景圖片
        Point start;  //起始點
        Point end;   //結(jié)束點
        bool need_draw_tmp;   //在MouseMove事件中判斷是否繪制矩形框

        string action_type = "";//繪圖動作類型
        bool is_first_down = true;//判斷是否第一次按下鼠標
        bool press_move_flag = false;
        public Form1()
        {
            InitializeComponent();
            comboBox1.SelectedIndex = 0;
            action_type = "矩形(填充)";
            bg_image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            //中間畫布
            tmp_bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            //創(chuàng)建空白畫板
            draw_paint = Graphics.FromImage(tmp_bitmap);
        }
        private void btn_load_bg_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "請選擇圖片";
            ofd.Filter = "所有文件|*.*";
            ofd.InitialDirectory = @"C:\Users";
            ofd.Multiselect = false;
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                string image_path = ofd.FileName;
                bg_image = Image.FromFile(image_path);
                bg_image = ImgUtils.resizeImg(bg_image, pictureBox1.Width, pictureBox1.Height);
                //tmp_bitmap.Save("finish.bmp");
                pictureBox1.Image = bg_image;
            }
        }
        private void draw_ploy(bool fill = true)
        {
            //繪制矩形框 并填充
            //抗鋸齒
            draw_paint.SmoothingMode = SmoothingMode.HighQuality;

            //填充多邊形
            if (fill)
            {
                draw_paint.FillPolygon(fill_brush, polyPoints.ToArray());
            }
            else
            {
                draw_paint.DrawPolygon(line_color, polyPoints.ToArray());
            }
            pictureBox1.Image = get_merge_bitmap();
            is_first_down = true;
            need_draw_tmp = false;
            polyPoints = null;
        }
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (action_type.IndexOf("矩形") >= 0)
            {
                if (e.Button == MouseButtons.Left)
                {
                    start = e.Location;
                    need_draw_tmp = true;
                }
            }
            else if (action_type.IndexOf("多邊形") >= 0)
            {
                Graphics g = pictureBox1.CreateGraphics();
                //繪制多邊形  low版本
                if (is_first_down)  //首先第一次創(chuàng)建兩個點如下(e.X, e.Y),( e.X + 1, e.Y + 1)
                {
                    //first point down
                    if (e.Button == MouseButtons.Left)
                    {
                        is_first_down = false;
                        if (polyPoints == null) polyPoints = new List<Point>();
                        polyPoints.Add(e.Location);
                        //Point point = new Point(e.X + 1, e.Y + 1);
                        //polyPoints.Add(point);
                        need_draw_tmp = true;
                    }
                }
                else
                {
                    //add new point
                    if (e.Button == MouseButtons.Left)
                    {
                        //添加新的點
                        Point point = new Point(e.X, e.Y);
                        polyPoints.Add(point);
                    }
                    else if (e.Button == MouseButtons.Right)
                    {
                        //把當前的點填充到頂點集合中去  方便填充
                        polyPoints.Add(e.Location);
                        draw_ploy(action_type.IndexOf("填充") >= 0);


                    }
                }
            }
            else if (action_type.IndexOf("畫筆") >= 0)
            {
                if (e.Button == MouseButtons.Left)
                {
                    press_move_flag = true;
                }
            }
            else if (action_type.IndexOf("橡皮擦") >= 0)
            {
                if (e.Button == MouseButtons.Left)
                {
                    press_move_flag = true;
                    start = e.Location;
                    //模式轉(zhuǎn)換為'CompositingMode.SourceCopy'
                    draw_paint.CompositingMode = CompositingMode.SourceCopy;
                    //用透明色替換指定的區(qū)域
                    draw_paint.FillEllipse(eraser_brush, e.X - line_width / 2, e.Y - line_width / 2, line_width, line_width);
                    //模式轉(zhuǎn)換為'CompositingMode.SourceOver',這樣后面可以進行繪圖
                    //draw_paint.CompositingMode = CompositingMode.SourceOver;

                }
            }
            end = e.Location;
            pictureBox1.Invalidate();
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (action_type.IndexOf("矩形") >= 0)
            {
                //繪制矩形框 并填充
                if (need_draw_tmp)
                {
                    if (e.Button != MouseButtons.Left) return;
                    end = e.Location;
                    pictureBox1.Invalidate();
                }
            }
            else if (action_type.IndexOf("多邊形") >= 0)
            {
                //繪制多邊形
                if (need_draw_tmp)
                {
                    //if (e.Button != MouseButtons.Left) return;
                    end = e.Location;
                    pictureBox1.Invalidate();//此代碼不可省略
                                             //Graphics g = pictureBox1.CreateGraphics();
                                             //抗鋸齒
                }
            }
            else if (action_type.IndexOf("畫筆") >= 0 )
            {
                if (press_move_flag == true && e.Button == MouseButtons.Left)
                {
                    end = e.Location;
                    draw_paint.FillEllipse(fill_brush, e.X - line_width / 2, e.Y - line_width / 2, line_width, line_width);

                    //畫點(鼠標位置示意圖)
                    Graphics g = pictureBox1.CreateGraphics();

                    g.FillEllipse(Brushes.Blue, e.X - line_width / 2, e.Y - line_width / 2, line_width, line_width);


                    pictureBox1.Image = get_merge_bitmap();
                    pictureBox1.Invalidate();//此代碼不可省略
                }
            }
            else if (action_type.IndexOf("橡皮擦") >= 0)
            {
                if (press_move_flag == true && e.Button == MouseButtons.Left)
                {
                    end = e.Location;

                    //用透明色替換指定的區(qū)域
                    draw_paint.FillEllipse(eraser_brush, e.X - line_width / 2, e.Y - line_width / 2, line_width, line_width);
                    pictureBox1.Image = get_merge_bitmap();
                    pictureBox1.Invalidate();//此代碼不可省略
                    Refresh();
                }
            }
        }
        private Bitmap get_merge_bitmap()
        {
            Bitmap tmp_bmp = (Bitmap)bg_image.Clone();
            merge_paint = Graphics.FromImage(tmp_bmp);
            merge_paint.DrawImage(tmp_bitmap, 0, 0);//將中間畫布繪制的內(nèi)容繪制到原始畫布上
            merge_paint.Dispose();
            return tmp_bmp;
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (action_type.IndexOf("矩形") >= 0)
            {
                //繪制矩形框 并填充
                if (e.Button == MouseButtons.Left)
                {
                    end = e.Location;
                    need_draw_tmp = false;
                }

                Graphics g = pictureBox1.CreateGraphics();
                if (action_type.IndexOf("填充") >= 0)
                {
                    draw_paint.FillRectangle(fill_brush, rectA);//填充顏色
                }
                else
                {
                    draw_paint.DrawRectangle(line_color, rectA);//填充顏色
                }
                //g.DrawImage(img, 0, 0);//在目標繪圖板上繪制圖片
                pictureBox1.Image = get_merge_bitmap();
                g.Dispose();
            }
            else if (action_type.IndexOf("畫筆") >= 0)
            {
                press_move_flag = false;
                pictureBox1.Invalidate();//此代碼不可省略
            }
            else if (action_type.IndexOf("橡皮擦") >= 0)
            {
                //模式轉(zhuǎn)換為'CompositingMode.SourceOver',這樣后面可以進行繪圖
                draw_paint.CompositingMode = CompositingMode.SourceOver;
                press_move_flag = false;
                pictureBox1.Invalidate();//此代碼不可省略
            }
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            PictureBox pic = sender as PictureBox;
            if (action_type.IndexOf("矩形") >= 0)
            {
                //繪制矩形框 并填充

                Pen pen = new Pen(Color.Red, 3);
                pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;     //繪制線的格式
                                                                            //繪制矩形框 并填充
                if (need_draw_tmp)
                {
                    //此處是為了在繪制時可以由上向下繪制,也可以由下向上
                    rectA = new Rectangle(Math.Min(start.X, end.X), Math.Min(start.Y, end.Y), Math.Abs(start.X - end.X), Math.Abs(start.Y - end.Y));
                    e.Graphics.DrawRectangle(pen, rectA);
                }
                pen.Dispose();
            }
            else if (action_type.IndexOf("多邊形") >= 0)
            {
                //多邊形
                if (polyPoints != null)
                {
                    if (need_draw_tmp)
                    {
                        //抗鋸齒
                        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
                        e.Graphics.DrawLine(Pens.Yellow, polyPoints.First(), end);
                        e.Graphics.DrawLine(Pens.Red, polyPoints.Last(), end);
                        if (polyPoints.Count > 1)
                        {
                            for (int i = 0; i < polyPoints.Count - 1; i++)
                            {
                                e.Graphics.DrawLine(Pens.Yellow, polyPoints[i], polyPoints[i + 1]);
                            }
                        }
                    }
                }
            }
            else if (action_type.IndexOf("畫筆") >= 00)
            {
                if (press_move_flag)
                {
                    e.Graphics.FillEllipse(Brushes.Blue, end.X - (line_width / 2), end.Y - (line_width / 2), line_width, line_width);
                }
            }
            else if (action_type.IndexOf("橡皮擦") >= 0)
            {
                if (press_move_flag)
                {
                    e.Graphics.FillEllipse(Brushes.Blue, end.X - (line_width / 2), end.Y - (line_width / 2), line_width, line_width);
                }
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            action_type = comboBox1.Text;
            Console.WriteLine(comboBox1.Text);
        }

        private void btn_color_Click(object sender, EventArgs e)
        {
            //選擇顏色 進行填充
            ColorDialog cl = new ColorDialog();
            if (cl.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                fill_color = Color.FromArgb(cl.Color.A, cl.Color.R, cl.Color.G, cl.Color.B);
                btn_color.BackColor = fill_color;
                fill_brush = new SolidBrush(fill_color);
                line_color = new Pen(fill_brush);
            }
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            line_width = trackBar1.Value;
            lab_line_width.Text = Convert.ToString(line_width);
        }


        private void btn_eraser_Click(object sender, EventArgs e)
        {
            action_type = "橡皮擦";
        }
    }
}

3、軟件使用

3.1 繪制矩形

繪制矩形時有兩種選擇,填充和不填充。每一次繪制前可以先選擇顏色。
c#設計并完成“繪圖工具”功能,要求能夠通過鼠標點擊繪制直線、矩形等功能,python、C++與C#實踐,c#,開發(fā)語言,ui

3.2 繪制多邊形

繪制矩形時有兩種選擇,填充和不填充。每一次繪制前可以先選擇顏色。
c#設計并完成“繪圖工具”功能,要求能夠通過鼠標點擊繪制直線、矩形等功能,python、C++與C#實踐,c#,開發(fā)語言,ui

3.3 使用畫筆

使用畫筆前可以先拖動進度條設置畫筆大小,然后再設置顏色
c#設計并完成“繪圖工具”功能,要求能夠通過鼠標點擊繪制直線、矩形等功能,python、C++與C#實踐,c#,開發(fā)語言,ui

3.4 使用橡皮擦

點擊橡皮擦即可使用橡皮擦功能,點擊繪圖框中的其他按鈕即可退出橡皮擦選擇其他繪圖功能。使用橡皮擦前可以先拖動進度條設置橡皮擦的大小。
c#設計并完成“繪圖工具”功能,要求能夠通過鼠標點擊繪制直線、矩形等功能,python、C++與C#實踐,c#,開發(fā)語言,ui

4、補充代碼

上面代碼中進行圖像resize的時候用到了以下工具代碼,可以保存為ImgUtils.cs。文章來源地址http://www.zghlxwxcb.cn/news/detail-777215.html

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 繪畫識別
{
    class ImgUtils
    {
        private static char[] base64CodeArray = new char[]
       {
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            '0', '1', '2', '3', '4',  '5', '6', '7', '8', '9', '+', '/', '='
       };
        public static bool IsBase64(string base64Str)
        {
            //string strRegex = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";

            if (string.IsNullOrEmpty(base64Str))
                return false;
            else
            {
                if (base64Str.Contains(","))
                    base64Str = base64Str.Split(',')[1];
                if (base64Str.Length % 4 != 0)
                    return false;
                if (base64Str.Any(c => !base64CodeArray.Contains(c)))
                    return false;
            }
            try
            {
                return true;
            }
            catch (FormatException)
            {
                return false;
            }
        }
        public static string ConvertImageToBase64(Image bmp)
        {
            try
            {
                MemoryStream ms = new MemoryStream();
                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] arr = new byte[ms.Length]; ms.Position = 0;
                ms.Read(arr, 0, (int)ms.Length); ms.Close();
                return Convert.ToBase64String(arr);
            }
            catch (Exception ex)
            {
                return "轉(zhuǎn)換錯誤";
            }
        }
        public static Image ConvertBase64ToImage(string base64String)
        {
            try
            {
                byte[] imageBytes = Convert.FromBase64String(base64String);
                using (MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length))
                {
                    ms.Write(imageBytes, 0, imageBytes.Length);
                    return Image.FromStream(ms, true);
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }
        public static Image resizeImg(Image sourceImage, int targetWidth, int targetHeight)
        {
            int width;//圖片最終的寬
            int height;//圖片最終的高
            try
            {
                //獲取圖片寬度
                int sourceWidth = sourceImage.Width;
                //獲取圖片高度
                int sourceHeight = sourceImage.Height;

                System.Drawing.Imaging.ImageFormat format = sourceImage.RawFormat;
                Bitmap targetPicture = new Bitmap(targetWidth, targetHeight);
                Graphics g = Graphics.FromImage(targetPicture);
                g.Clear(Color.White);
                g.DrawImage(sourceImage, 0, 0, targetWidth, targetHeight);
                sourceImage.Dispose();
                return targetPicture;
            }
            catch (Exception ex)
            {

            }
            return null;
        }

    }

}

到了這里,關(guān)于使用c#實現(xiàn)一個簡單繪圖軟件(繪制矩形、多邊形,畫筆、橡皮擦功能)的完整教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關(guān)文章

  • 使用unity繪制扇形,圓形和矩形區(qū)域

    使用unity繪制扇形,圓形和矩形區(qū)域

    使用unity繪制扇形.圓形和矩形區(qū)域: 效果如圖: 扇形 ?矩形 ?圓形 ?下面是代碼: 1.首先我們需要給對應的組件添加一個LineRenderer組件并獲得他 2.編寫方法: 1.扇形 其中?positionCount 之所以需要+2 是因為除了我們需要的角度外 還需要額外繪制2條回歸線所以直接通過代碼的方式設置

    2024年02月15日
    瀏覽(38)
  • 使用openCV python繪制實心旋轉(zhuǎn)的矩形

    使用openCV python繪制實心旋轉(zhuǎn)的矩形

    ? 看方法直接看最下邊 看方法直接看最下邊 看方法直接看最下邊 一、通過中心點、寬高、角度得到四個頂點的公式網(wǎng)上都有,最后輸出四個頂點的x和y坐標。 二、繪制實心矩形 關(guān)于怎么繪制實心矩形,因為openCV本身的cv2.rectangle只能繪制角度為0的矩形,沒辦法用,所以一開

    2024年02月09日
    瀏覽(20)
  • Flutter筆記:完全基于Flutter繪圖技術(shù)繪制一個精美的Dash圖標(下)

    Flutter筆記:完全基于Flutter繪圖技術(shù)繪制一個精美的Dash圖標(下)

    Flutter筆記 完全基于Flutter繪圖技術(shù)繪制一個精美的Dart吉祥物Dash 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 郵箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134098955 另見: 上上篇文章:《完全基于Flutter繪圖技術(shù)繪制一個精美的Dart語言吉祥物

    2024年02月07日
    瀏覽(39)
  • Flutter筆記:完全基于Flutter繪圖技術(shù)繪制一個精美的Dash圖標(上)

    Flutter筆記:完全基于Flutter繪圖技術(shù)繪制一個精美的Dash圖標(上)

    Flutter筆記 完全基于Flutter繪圖技術(shù)繪制一個精美的Dart語言吉祥物Dash(上) 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 郵箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134098877 【介紹】:本文完全基于Flutter繪圖技術(shù)繪制一個精美的Dash圖標(上

    2024年02月07日
    瀏覽(38)
  • Flutter筆記:完全基于Flutter繪圖技術(shù)繪制一個精美的Dash圖標(中)

    Flutter筆記:完全基于Flutter繪圖技術(shù)繪制一個精美的Dash圖標(中)

    Flutter筆記 完全基于Flutter繪圖技術(shù)繪制一個精美的Dart語言吉祥物Dash(中) 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 郵箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134098877 【介紹】:本文完全基于Flutter繪圖技術(shù)繪制一個精美的Dash圖標(中

    2024年02月06日
    瀏覽(25)
  • Python OpenCV實現(xiàn)鼠標繪制矩形框和多邊形

    Python OpenCV實現(xiàn)鼠標繪制矩形框和多邊形

    目錄 Python OpenCV實現(xiàn)鼠標繪制矩形框和多邊形 1. OpenCV鼠標事件操作說明 (1)setMouseCallback函數(shù)說明 (2)回調(diào)函數(shù)onMouse說明 (3)event 具體說明: (4)flags 具體說明 2. OpenCV實現(xiàn)鼠標繪制矩形框和多邊形框 (1)繪制矩形框 (2)繪制多邊形 (3)鍵盤控制 3. 完整的代碼 本篇將

    2024年02月06日
    瀏覽(131)
  • 【使用C#建立一個簡單的員工管理系統(tǒng)】

    【使用C#建立一個簡單的員工管理系統(tǒng)】

    1.使用到的軟件Microsoft Visual Studio(用來設計和編寫WindowsForms程序)、Microsoft SQL Server(用來儲存員工的信息并且與Microsoft Visual Studio進行連接進行增刪查改的操作)。 2.項目由三層架構(gòu)的設計方式來編寫代碼 UI(表現(xiàn)層)、BLL:(業(yè)務邏輯層)、DAL:(數(shù)據(jù)訪問層)、(Model)作為數(shù)據(jù)傳遞的載

    2024年02月01日
    瀏覽(63)
  • 使用opencv在圖片上繪制矩形框,查看圖片中某點坐標坐標點

    介紹 安裝 OpenCV 繪制矩形 查看點坐標 總結(jié) OpenCV 是一個開源的計算機視覺庫,提供了豐富的圖像處理和計算機視覺功能。在科學研究、計算機視覺應用以及機器學習領域,它都被廣泛應用。本文將介紹如何使用 Python 的 OpenCV 庫來查看一張圖片的坐標點。 在開始之前,我們首

    2024年02月11日
    瀏覽(22)
  • C#之基于winform窗體繪制簡單圖形

    C#之基于winform窗體繪制簡單圖形

    什么是窗體? 可以理解為是一個自定義的控制臺應用程序。 假如需要僅僅是用vs制作游戲的話,那么vs中,我們平時所用到的控制臺應用程序所呈現(xiàn)的窗口時遠遠不夠用的。因此需要自定義窗體。 因此在新建項目時,我們不能再使用控制臺應用程序,而是應該選擇窗體: 之

    2023年04月16日
    瀏覽(17)
  • 我用nodejs和electron實現(xiàn)了一個簡單的聊天軟件-----chat 開源

    我用nodejs和electron實現(xiàn)了一個簡單的聊天軟件-----chat 開源

    ??https://www.bilibili.com/video/BV1Fg4y1u76d/ 希望觀眾老爺給個免費的三連支持一下新人up主 翎 是基于 electron(vue2) 和 nodejs 實現(xiàn)的簡單聊天軟件,其中用 websocket 和 http 進行通訊傳遞,數(shù)據(jù)庫使用了 mysql 數(shù)據(jù)庫,該項目功能簡單,界面簡潔,適合正在練習 websocket 和 vue 的小白查看代碼,代碼

    2024年02月12日
    瀏覽(94)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包