2

我正在尝试制作一个简单的应用程序,用户可以在其中绘制面板并将其作为位图保存到他们的计算机中。但是,当我继续进行保存部分时,我得到的只是一个空(白色)位图。

我一直在浏览许多其他解决方案,并且我很确定我以正确的方式保存位图,所以我开始怀疑我的绘图过程是否不正确。这里到底有什么问题?

public partial class Form1 : Form
{

    SolidBrush brush;
    Pen pen;
    Point[] points = new Point[3];
    Graphics display;
    Bitmap bmap;

    public Form1()
    {
        InitializeComponent();
        display = panel1.CreateGraphics();
        bmap = new Bitmap(panel1.Width, panel1.Height);
    }


    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        brush = new SolidBrush(Color.Black);
        pen = new Pen(Color.Black);


        display.FillEllipse(brush, e.X, e.Y, 10, 10);
        panel1.DrawToBitmap(bmap, new Rectangle(0, 0, panel1.Width, panel1.Height));

        //this.Invalidate();
    }



    private void clearToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Graphics display = panel1.CreateGraphics();
        display.Clear(panel1.BackColor);

    }

    private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {



        bmap.Save(@"C:\Temp\Test.bmp");

    }
}

编辑有了这个版本,我只得到一个黑色的 bmp,我什至看不到在我的屏幕上创建省略号。虽然我确实注意到,如果我在 mousedown 事件中将 invalidate 和 Draw to bitmap 放回位图,那么保存按钮将保存最后一个椭圆,而我的屏幕上仍然没有任何内容。

private void panel1_MouseDown(object sender, MouseEventArgs e)
        {

            mousedown = true;
            x = e.X;
            y = e.Y;

        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            //Graphics g = e.Graphics;
            if(mousedown==true)

            {
            brush = new SolidBrush(Color.Black);
            pen = new Pen(Color.Black);

            Graphics.FromImage(bmap).FillEllipse(brush, x, y, 10, 10);
            panel1.Invalidate();
           //panel1.DrawToBitmap(bmap, new Rectangle(0, 0, panel1.Width, panel1.Height));


            //panel1.Invalidate();

            }
        }
4

2 回答 2

3

正如 Hans 在他的评论中所做的大部分工作一样,您的代码应该如下所示:

public partial class Form1 : Form {
  Bitmap bmap;

  public Form1() {
    InitializeComponent();

    bmap = new Bitmap(panel1.ClientWidth, panel1.ClientHeight);
    panel1.MouseDown += panel1_MouseDown;
    panel1.Paint += panel1_Paint;
  }

  void panel1_Paint(object sender, PaintEventArgs e) {
    e.Graphics.DrawImage(bmap, Point.Empty);
  }

  void panel1_MouseDown(object sender, MouseEventArgs e) {
    using (Graphics g = Graphics.FromImage(bmap)) {
      g.FillEllipse(Brushes.Black, e.X, e.Y, 10, 10);
    }
    panel1.Invalidate();
  }

  private void clearToolStripMenuItem_Click(object sender, EventArgs e) {
    using (Graphics g = Graphics.FromImage(bmap)) {
      g.Clear(Color.White);
    }
    panel1.Invalidate();
  }

  private void saveToolStripMenuItem_Click(object sender, EventArgs e) {
    bmap.Save(@"c:\temp\bmap.bmp");
  }
}

CreateGraphics 只是一个临时画布,因此您很少(如果有的话)将其用于绘图目的,尤其是在您尝试保存图像时。

于 2013-05-09T14:49:18.300 回答
0

这将正常工作。我测试了它并且运行良好

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace drawing
{
    public partial class Form2 : Form
    {
        Graphics g;
        bool startPaint = false;
        int? initX = null;
        int? initY = null;

        bool drawSquare = false;
        bool drawRectangle = false;
        bool drawCircle = false;
        public Form2()
        {
            InitializeComponent();

            bmp = new Bitmap(panel1.ClientSize.Width, panel1.ClientSize.Height);

        }
        Bitmap bmp;

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

        }
        void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (startPaint)
            {
                using ( g = Graphics.FromImage(bmp))
                {
                  //  g.FillEllipse(Brushes.Black, new Rectangle(e.X, e.Y , 5, 5));

                    Pen p = new Pen(btn_PenColor.BackColor, float.Parse(cmb_PenSize.Text));
                    g.DrawLine(p, new Point(initX ?? e.X, initY ?? e.Y), new Point(e.X, e.Y));
                    initX = e.X;
                    initY = e.Y;
                    //g.DrawImage(bmp, new Rectangle(e.X - 4, e.Y - 4, 8, 8));
                }
                panel1.Invalidate();
            }
        }
        private void pnl_Draw_MouseDown(object sender, MouseEventArgs e)
        {
            startPaint = true;
             if (drawSquare)
             {
                 //Use Solid Brush for filling the graphic shapes
                 SolidBrush sb = new SolidBrush(btn_PenColor.BackColor);
                 //setting the width and height same for creating square.
                 //Getting the width and Heigt value from Textbox(txt_ShapeSize)
                 g.FillRectangle(sb, e.X, e.Y, int.Parse(txt_ShapeSize.Text), int.Parse(txt_ShapeSize.Text));
                 //setting startPaint and drawSquare value to false for creating one graphic on one click.
                 startPaint = false;
                 drawSquare = false;
             }
             if (drawRectangle)
             {
                 SolidBrush sb = new SolidBrush(btn_PenColor.BackColor);
                 //setting the width twice of the height
                 g.FillRectangle(sb, e.X, e.Y, 2 * int.Parse(txt_ShapeSize.Text), int.Parse(txt_ShapeSize.Text));
                 startPaint = false;
                 drawRectangle = false;
             }
             if (drawCircle)
             {
                 SolidBrush sb = new SolidBrush(btn_PenColor.BackColor);
                 g.FillEllipse(sb, e.X, e.Y, int.Parse(txt_ShapeSize.Text), int.Parse(txt_ShapeSize.Text));
                 startPaint = false;
                 drawCircle = false;
             }
        }
         private void pnl_Draw_MouseUp(object sender, MouseEventArgs e)
        {
            startPaint = false;
            initX = null;
            initY = null;
        }
        void panel1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(bmp, Point.Empty);
        }


        private void button1_Click(object sender, EventArgs e)
        {
            bmp.Save("D://filename.jpg", ImageFormat.Png);
        }


    }
}
于 2015-06-07T14:30:56.903 回答