Guardar la imagen bmp varias veces en la misma ruta C#

Entonces, estoy trabajando en mi aplicación de pintura. Cada vez que hago cambios, el estado actual de la pantalla se copia y se guarda como una imagen de mapa de bits en mi disco (para que pueda usarla en mi evento de pintura).

El problema ocurre cuando minimizo y devuelvo la ventana a su estado normal y luego trato de dibujar. Esto activa mi evento reaccionando a los cambios, el programa intenta guardar la imagen ---->>> kabooom.

Dice "Ocurrió un error genérico en GDI+". Entonces, he estado navegando por varios foros en busca de la respuesta, pero ninguno de ellos me dio una respuesta verdadera, todos mencionan rutas incorrectas, etc., pero estoy bastante seguro de que eso es no el problema ¿Tengo que desechar el mapa de bits o hacer algo con la secuencia?

        int width = pictureBox1.Size.Width;
        int height = pictureBox1.Size.Height;

        Point labelOrigin = new Point(0, 0); // this is referencing the control
        Point screenOrigin = pictureBox1.PointToScreen(labelOrigin);

        int x = screenOrigin.X;
        int y = screenOrigin.Y;

        Rectangle bounds = this.Bounds;
        using (Bitmap bitmap = new Bitmap(width, height))
        {
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                g.CopyFromScreen(new Point(x, y), Point.Empty, bounds.Size);
            }
            bitmap.Save(_brojFormi + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);                
        }

preguntado el 12 de junio de 12 a las 16:06

Cual es el valor de bounds.Size cuando hace kaboom? -

¿De qué línea de código viene el error? Además, publique el stacktrace completo. -

límites. El tamaño está bien, no hay nada de qué preocuparse. El programa falla en bitmap.Save(); Después de cambiar el tamaño del formulario, la imagen se vuelve a dibujar correctamente, pero si trato de hacer cambios después de eso, falla.. -

1 Respuestas

Eres guardar una imagen en el disco por lo que puede usarlo en otro evento? Guau.

¿Por qué no usar simplemente una variable global de clase para almacenar el mapa de bits?

class MyForm
{
    Bitmap currentImage = null;
    Graphics gfx = null;

    private void btnLoad_Click(object sender, EventArgs e)
    {
        // ...
        currentImage = new Bitmap(fileName);
        gfx = Graphics.FromImage(currentImage);
    }

    private void pbEditor_Paint(object sender, PaintEventArgs e)
    {
        if (currentImage != null && gfx != null)
        {
             lock(currentImage) e.Graphics.DrawImage(currentImage, ...);
        }
    }

    private void pbEditor_Click(object sender, MouseEventArgs e)
    {
        // quick example to show bitmap drawing
        if (e.Button == MouseButtons.Left)
            lock(currentImage) currentImage.SetPixel(e.Location.X, e.Location.Y, Colors.Black);
    }
}

Respondido el 12 de junio de 12 a las 16:06

Estoy guardando cada cambio en mi formulario, eso es lo importante en esa oración. Cada cambio se guarda correctamente hasta que cambie el tamaño de mi formulario. Cada próximo cambio después de cambiar el tamaño provoca un bloqueo. Podría usar una variable global, pero de todos modos debo almacenar la imagen en el disco. El problema es guardarlo varias veces después de cambiar el tamaño, global o localmente, no importa. - omegasbk

Sí, el evento de cambio de tamaño se activará repetidamente, independientemente del tiempo que se tarde en guardar el archivo. Por lo tanto, probablemente esté guardando, obteniendo un nuevo evento antes de que se complete la operación de guardado y luego intentando guardar de nuevo. Eso causará el error GDI+. - Polinomio

Además, está haciendo una copia desde la pantalla durante un cambio de tamaño de formulario. Si un usuario tiene desactivada la función dibujar mientras se cambia el tamaño en su perfil de tema de Windows, o si está usando un escritorio remoto, obtendrá una imagen en blanco (o un bloqueo si el identificador está invalidado). - Polinomio

Sip: ResizeBegin y ResizeEnd. - Polinomio

El guardado se realiza estrictamente en el evento mouse_up (lo que significa que el dibujo de una forma ha terminado), por lo que no se puede cambiar el tamaño al mismo tiempo que se guarda la imagen, ¡cambiar el tamaño no es un problema! Mi imagen se vuelve a dibujar después de devolver la ventana a su estado normal (todos los guardados antes de cambiar el tamaño se realizan con éxito). ¡¿Sucede algo con la ruta después de cambiar el tamaño?! - omegasbk

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.