Как исправить эту ошибку «В GDI + произошла общая ошибка»? - PullRequest
0 голосов
/ 09 июля 2019

Откройте изображение из имени по умолчанию и сохраните его под именем по умолчанию. (Перезаписать его)

Мне нужно сделать графику из изображения ("Default.jpg"), чтобы поместить ее в picturebox1.image и нарисовать некоторую графику.на picurebox1. (это работает, и это не моя проблема). Но я не могу сохранить файл picturebox1.Изменение изображения в «Default.jpg» (это моя проблема). Если я изменяю имя сохранения, оно работает, но мне нужно его перезаписатьи открой его много раз.Спасибо

    Boolean Play = false;
    Pen P = new Pen(Color.Black, 2);
    Graphics Temp;
    int X1, X2, Y1, Y2;
    Image Default_Image = new Bitmap("Default.jpg");
    public Form1()
    {
        InitializeComponent();
        Temp = pictureBox1.CreateGraphics();
    }
    private void PictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (Play)
        {
            X2 = e.X;
            Y2 = e.Y; ;
            Temp.DrawLine(P, X1, Y1, X2, Y2);
            pictureBox1.Image.Save("Default.jpg");
            Play = false;
        }
        else
        {
            Default_Image = new Bitmap("Default.jpg");
            Temp = Graphics.FromImage(Default_Image);
            pictureBox1.Image =Default_Image;
            X1 = e.X;
            Y1 = e.Y;
            Play = true;
        }
    }

{"В GDI + произошла общая ошибка."}

1 Ответ

0 голосов
/ 09 июля 2019

Чтобы перезаписать изображение, которое необходимо убедиться, что нет подключений к нему. Closing, Disposing или Cloning недостаточно ...

Вот функция, которая создает действительно независимую копию:

Bitmap GetClone(string imageName)
{
    if (!File.Exists(imageName)) return null;
    Bitmap bmp2 = null;
    using (Bitmap bmp = (Bitmap)Bitmap.FromFile(imageName))
    {
        bmp2 = new Bitmap(bmp.Width, bmp.Height, bmp.PixelFormat);
        bmp2.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
        using (Graphics g = Graphics.FromImage(bmp2))
        {
            g.DrawImage(bmp, 0, 0);
        }
    }
    return bmp2;
}

Теперь вы можете сделать это:

string file = yourImageFileName;
Bitmap bmp = GetClone(file);
using (Graphics g = Graphics.FromImage(bmp))
{
    // draw what you want..
    g.DrawRectangle(Pens.Red, 11, 11, 199, 199);
}
bmp.Save(file, ImageFormat.Png);  // use your own format etc..

Вы также должны позаботиться о том, чтобы не пропустить старые PictureBox.Image версии. Вот вспомогательная функция:

void SetPBoxImage(PictureBox pbox, Bitmap bmp)
{
    Bitmap dummy = (Bitmap)pbox.Image;
    pbox.Image = null;
    if (dummy != null) dummy.Dispose();
    pbox.Image = bmp;
}
...