1.实现思路

一个变量 Bitmap 用于存储绘制的图片,鼠标的每次绘制都会保存到该变量。

一个bool判断是否处于绘画状态

主要用到控件 PictureBox  加两个按钮一个选择颜色,一个用于保存Bitmap图片,还加一个数字选择控件选择画笔大小。

  1. 窗体加载时,Bitmap初始化为pictureBox大小,给 PictureBox设置Image为Bitmap,初始化画板为白色
  2. pictureBox的监听事件,鼠标左键按下时,记录第一个点,及初始化用户设置的画笔,开启绘画状态
  3. pictureBox的监听事件,鼠标左键移动时(处于绘画状态),从Bitmap得到画板,绘制首尾直线到Bitmap,然后设置pictureBox的image为Bitmap进行显示。
  4. pictureBox的监听事件,鼠标左键释放时,结束绘画状态,此时所有的路径都已经绘制到了Bitmap。
  5. 点击保存按钮 选择一个文件夹,自定义文件名称,保存这个Bitmap。

2.代码如下:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms;

namespace DrawingTest {
    public partial class Form1 : Form {
        int gw=0; //画板宽
        int gh=0; //画板高
        public Form1() {
            InitializeComponent();
            gw = this.pictureBox1.Width;
            gh = this.pictureBox1.Height;
            btmp = new Bitmap(gw,gh); //初始化图片
            //初始化画板
            g = Graphics.FromImage(btmp);
            g.Clear(Color.White);
            this.pictureBox1.Image = btmp;
            g.Dispose();
        }
        //画图程序,所需变量如下:
        Bitmap btmp; //绘制形成的图片,可以保存
        Graphics g = null; //绘制画板
        Pen p = null;  //绘制画笔
        int ps = 3; //画笔大小
        Color pc = Color.Black; //画笔颜色
        bool isDrawing = false; //是否正在画画状态,鼠标左键处于按下时表明正在画画状态,松开表明不在画画状态
        float xx = 0; //画笔当前x坐标
        float yy = 0; //画笔当前y坐标

        //按钮-画笔颜色选择
        private void colorSelect_Click(object sender, EventArgs e) {
            if (this.colorDialog1.ShowDialog() == DialogResult.OK) {
                pc = this.colorDialog1.Color;
            }
        }
        //按钮-保存图片,可以设置格式
        private void btmpSave_Click(object sender, EventArgs e) {
            this.saveFileDialog1.Filter="(png)|*.png|(jpg)|*.jpg";
            if (this.saveFileDialog1.ShowDialog() == DialogResult.OK) {
                String targetFn = this.saveFileDialog1.FileName;
                btmp.Save(targetFn,ImageFormat.Png);
            }
        }
        //控件-画笔大小选择
        private void penSize_SelectedIndexChanged(object sender, EventArgs e) {
            int size = Convert.ToInt32(this.penSize.SelectedItem.ToString());
            switch (size) {
                case 3:
                    ps = 3;
                    break;
                case 5:
                    ps = 5;
                    break;
                case 10:
                    ps = 10;
                    break;
                default:
                    break;
            }
        }

        //在画板上鼠标左键按下时
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
            if (e.Button == MouseButtons.Left) {
                xx = e.X;
                yy = e.Y;
                //设置用户的画笔
                p = new Pen(pc, ps);
                isDrawing = true;
            }
        }
        //在画板上鼠标左键移动时
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
            if ((isDrawing) && (e.Button == MouseButtons.Left)) {
                g = Graphics.FromImage(btmp);
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//设置抗锯齿
                g.DrawLine(p, new Point((int)xx, (int)yy), new Point(e.X, e.Y)); //绘制到Bitmap
                this.pictureBox1.Image = btmp; //在控件显示Bitmap
                xx = e.X;
                yy = e.Y;
                g.Dispose();
            }
        }
        //在画板上鼠标左键抬起时,得到最终图片
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e) {
            if ( isDrawing && e.Button == MouseButtons.Left) {
                isDrawing = false;
            }
        }
        


    }



}

效果:

 

 

 

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐