Mi programa le permite al usuario dibujar en un cuadro de imagen que es una especie de forma similar a MS paint, y ahora estoy tratando de guardar el cuadro de imagen como .archivo jpg, pero estoy teniendo null error de excepción cuando se trata de hacerlo.

Edit: cabe mencionar que esta es una excepción NullReferenceException

Aquí está mi botón save donde puedo conseguir el error de excepción:

   private void button3_Click(object sender, EventArgs e)
    {
        pictureBox1.Image.Save(@"C:\New folder\picture.jpg", ImageFormat.Jpeg);
    }

y aquí está el resto de mi código:

    public Form2()
{
InitializeComponent();
//creates items for combobox brush sizes
for (int i = 1; i <= 20; i++)
{
string[] numbers = { i.ToString() };
comboBox1.Items.AddRange(numbers);
}
}
bool paint = false;
SolidBrush color = new SolidBrush(Color.Black);
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
paint = true;
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
paint = false;
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (paint == true)
{
int brushSize = Convert.ToInt32(comboBox1.SelectedItem);
Graphics g = pictureBox1.CreateGraphics();
if (comboBox1.SelectedIndex > 0)
{
g.FillEllipse(color, e.X, e.Y, brushSize, brushSize);
}
else
{
g.FillEllipse(color, e.X, e.Y, 10, 10);
}
g.Dispose();
}
}
//button that opens colour dialog box
private void button1_Click_1(object sender, EventArgs e)
{
ColorDialog cld = new ColorDialog();
if (cld.ShowDialog() == DialogResult.OK)
{
color = new SolidBrush(cld.Color);
}
}
//Button that clears pictureBox
private void Button2_Click_1(object sender, EventArgs e)
{
Graphics g1 = pictureBox1.CreateGraphics();
g1.Clear(pictureBox1.BackColor);
}
  • Está usted seguro de que el Button_Click_1 no ocurrir antes de que usted está tratando de guardar la imagen ?
  • ¿Cómo funciona este primer botón haga clic en el efecto que el botón de guardar haga clic en?
  • Nunca en realidad asignado el control PictureBox.Las propiedades de la imagen, la opción de pintar directamente en su lugar. Que funciona bien. Que la propiedad es null aunque, kaboom cuando intenta guardar.
InformationsquelleAutor Rin | 2013-09-01

4 Comentarios

  1. 1

    Debe dibujar todo en una Imagen a través de la correspondiente Graphics objeto. Aquí está el multado código he corregido, es al menos mejor y sucinta de su código:

     public Form2() {
    InitializeComponent();
    //creates items for combobox brush sizes
    for (int i = 1; i <= 20; i++)
    {
    string[] numbers = { i.ToString() };
    comboBox1.Items.AddRange(numbers);
    }
    //initialize a blank image for your PictureBox
    pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
    g = Graphics.FromImage(pictureBox1.Image);
    }
    Graphics g;
    SolidBrush color = new SolidBrush(Color.Black);
    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
    int brushSize = comboBox1.SelectedIndex > 0 ?
    Convert.ToInt32(comboBox1.SelectedItem) : 10;
    g.FillEllipse(color, e.X, e.Y, brushSize, brushSize);
    pictureBox1.Invalidate();//This is important to re-draw the updated Image
    }
    }
    //button that opens colour dialog box
    private void button1_Click_1(object sender, EventArgs e) {
    ColorDialog cld = new ColorDialog();
    if (cld.ShowDialog() == DialogResult.OK) {
    color = new SolidBrush(cld.Color);
    }
    }
    //Button that clears pictureBox
    private void Button2_Click_1(object sender, EventArgs e) {
    g.Clear(pictureBox1.BackColor);
    }
    private void button3_Click(object sender, EventArgs e) {
    pictureBox1.Image.Save(@"C:\New folder\picture.jpg", ImageFormat.Jpeg);
    }
    • Hola, agradezco mucho lo que pasó el tiempo para arreglar mi código 🙂 parece casi funcione a la perfección. No guardar el dibujo, pero tiene un color negro de fondo, por alguna razón.
  2. 0

    Si el error es ArgumentNullException, a continuación, asegúrese de que la carpeta que está tratando de salvar a existe

    http://msdn.microsoft.com/en-us/library/9t4syfhh.aspx

    EDICIÓN:

    Más para el comentario de abajo, este problema es más probable que sea causado porque no tienes la imagen cargada en el PictureBox.

    Ver este.

    • Hola, supongo que debería haber especificado que esta fue una excepción NullReferenceException
    • véase mi edición
  3. 0

    Creo que su picturebox no tiene foto. Cuando usted haga clic en button1 su imagen cuadro de imagen es nulo. Derecho haga clic en el cuadro de imagen y en las propiedades de importación algunas fotos antes de ejecutar el código.

    • Hola, he añadido un fondo blanco en virtud de las propiedades que se deshizo de el nula de error, pero ahorra en blanco de la imagen, incluso cuando estoy de sorteo en él. Tal vez sepa ninguna de las fuentes buenas o útiles de códigos que podría utilizar para este problema?
    • Hola, creo que este enlace ayudar a su problema enlace
  4. 0

    Como Rey Rey demostrado por encima de, la re-creación de la Graphics objeto puede causar parpadeo. También, usted tiene que crear el mapa de bits mediante FromImage o el dibujo no va a ser a la imagen, y lo seguirá siendo nula a pesar de lo que usted ve en la pantalla.

    //declare graphics globally
    Graphics g; 
    private void Form_Load(object sender, EventArgs e)
    {
    picCanvas.Image = new Bitmap(picCanvas.Width, picCanvas.Height);
    //create the graphics object here and not in DrawLine, which 
    //may cause flicker each time its instantiated
    graphics = Graphics.FromImage(picCanvas.Image);
    DrawLine();
    }
    private void DrawLine()
    {
    //Do not recreate the Graphics object here. 
    //Recreating it seems to 'erase' the existing image
    //Which causes flicker that double-buffering can't manage
    System.Drawing.Pen pen;
    pen.Color = Color.Black;
    //If you create the graphics object from the bitmap, this
    //should paint to the bitmap, so the Image object won't be null
    g.DrawLine(1, 1, picCanvas.Width - 2, picCanvas.Height - 2);   
    }

Dejar respuesta

Please enter your comment!
Please enter your name here