2013-05-09 50 views
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事件中,那么保存按钮将保存最后一个椭圆,而屏幕上仍然没有任何东西出现。

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(); 

      } 
     } 
+0

关于CreateGraphics有很多很多问题。始终以相同的答案,不要使用它。相反,使用Graphics.FromImage()绘制位图。 panel1.Invalidate()获取它的屏幕更新,panel1.Paint事件来绘制它。 – 2013-05-09 11:25:32

+0

我在这里有点迷路。我使用panel1_MouseDown只是为了保持鼠标点击的坐标以及鼠标点击的布尔值。现在我甚至无法再看到我的椭圆,相反,面板保持白色,而保存的文件完全是黑色的。我将编辑我的更新版本的帖子。 – krikara 2013-05-09 11:48:16

回答

3

正如汉斯做了大部分在他的评论的工作,这里是如何你的代码也许应该看看:

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只是一个暂时的画布,所以你很少,如果有的话,请使用用于绘图的目的,特别是因为您正在尝试保存图像。

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); 
     } 


    } 
} 
+0

当我使用此代码时,面板会闪烁,当我尝试绘制时 – aswzen 2016-09-05 03:33:18