2009-06-30 10 views
9

Tengo un PictureBox en mi aplicación Windows Forms.Cómo guardar un control de cuadro de imagen como un archivo jpeg después de haberlo editado

Cargué una imagen y habilité el evento Paint en mi código. Dibuja un rectángulo.

De esta manera:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics gr = e.Graphics; 
    Pen p = new Pen(Color.Red); 
    p.Width = 5.0f; 
    gr.DrawRectangle(p, 1, 2, 30, 40); 
} 

Y hago clic en el botón "Guardar":

private void button2_Click(object sender, EventArgs e) 
{ 
    pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg); 
} 

Pero el archivo guardado nunca contiene el rectángulo que dibujé.

¿Alguien tiene alguna idea?

Respuesta

5

Probablemente no debería dibujar directamente en el cuadro de imagen.

En su lugar, necesita utilizar un mapa de bits. Intenta colocar el mapa de bits en PictureBox.Image y luego llama a Save().

Comprobar this para más detalles

1

Necesita pintura para la imagen de la imagen, no para el control de Gráficos en el evento Pintura.

EDIT:

using(Graphics g = Graphics.FromImage(pictureBox1.Image)) { 
    // there you will be do, what you do in Paint event 
} 

// ... somewhere else ... 
pictureBox1.Save(_required_parameters_); 
+2

Hola Puede aclarar/dar un ejemplo? – tguclu

5

Thanks.Your anwers todos ayudaron. Esto funcionó

 private void button1_Click(object sender, EventArgs e) 
    { 
     [email protected]"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000.jpg" ; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg); 
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 

    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     Bitmap bmp = new Bitmap(pictureBox1.Image); 
     Graphics gr = Graphics.FromImage(bmp); 
     Pen p = new Pen(Color.Red); 
     p.Width = 5.0f; 
     gr.DrawRectangle(p, 1, 2, 30, 40); 
     pictureBox1.Image = bmp; 
    } 
+2

Debes usar el patrón "using (...) {...}". Ahora, puedes tener algunas pérdidas de memoria. Y si alguna respuesta resuelve tu respuesta, deberías aceptarla;). – TcKs

3

Aquí está mi solución con soporte adicional para varios tipos de archivos:

public void ExportToBmp(string path) 
    { 
     using(var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height)) 
     { 
     pictureBox.DrawToBitmap(bitmap, pictureBox.ClientRectangle); 
     ImageFormat imageFormat = null; 

     var extension = Path.GetExtension(path); 
     switch (extension) 
     { 
      case ".bmp": 
       imageFormat = ImageFormat.Bmp; 
       break; 
      case ".png": 
       imageFormat = ImageFormat.Png; 
       break; 
      case ".jpeg": 
      case ".jpg": 
       imageFormat = ImageFormat.Jpeg; 
       break; 
      case ".gif": 
       imageFormat = ImageFormat.Gif; 
       break; 
      default: 
       throw new NotSupportedException("File extension is not supported"); 
     } 

     bitmap.Save(path, imageFormat); 
     } 
    } 
3

Aquí es un pequeño ejemplo que aclara algunas cosas para mí (yo estaba luchando con esto un poco demasiado)

PBOX es un cuadro de imagen en Form1, que sea al menos 50x50

appPath se deriva de System.Reflection pero el uso de cualquier camino te gusta

Hay dos botones, uno para el dibujo, uno para el ahorro, sus eventos de clic están en el código a continuación.

cosas que aprendí:

(1) "pBox.Image =" no hacer nada más que inicializar la imagen PBOX, que no tiene que ser un nombre de archivo como todos los ejemplos que encontré acostumbrado (ahorro problema tenía a ese mismo archivo porque se compartió bloqueado). Además, si su objetivo es ver cosas en toda la superficie del control, probablemente le gustará configurar el tamaño en el momento de inicialización al tamaño que necesita. Usé el tamaño de pBox en este ejemplo, pero normalmente uso el tamaño de mapa de bits (porque normalmente comienzo con un archivo de imagen real).

(2) Siempre tuve problemas para ver mis dibujos aparecer en el control o ver mis cambios guardados en el archivo de salida (o ambos). En mis intentos anteriores, duplicaba los sorteos tanto en el control como en el mapa de bits. Por supuesto, eso no es necesario, pero el mapa de bits editado DEBE volver a cargarse en la imagen de control ... y ESO era la pieza de este rompecabezas que me faltaba.

(A) Crear un mapa de bits de la control.image y dibujar en el mapa de bits

(B) Cargar el mapa de bits en el control.Image (para que pueda ver los cambios causados ​​por el sorteo)

(C) Guarde el control.Image

(2-opción) Usted tiene un mapa de bits global (o pasado) (probablemente de un archivo real)

(a) Dibujar en el mapa de bits

(B) Cargar el mapa de bits en el control.Image (para que pueda ver los cambios)

(C) Guardar el mapa de bits

public Form1() 
    { 
     InitializeComponent(); 
     pBox.Image = new Bitmap(pBox.Width, pBox.Height); 
    } 

    private void DrawStuff1_Click(object sender, EventArgs e) 
    { 
     Bitmap bmp = new Bitmap(pBox.Image); 
     Graphics g = Graphics.FromImage(bmp); 

     g.FillRectangle(Brushes.Red, 5, 5, 25, 25); //hard-coded size to reduce clutter 

     pBox.Image = bmp; //this makes your changes visible 
    } 

    private void Save_Click(object sender, EventArgs e) 
    { 
     pBox.Image.Save(appPath + "SavedImage.bmp"); 
    } 
Cuestiones relacionadas