«В GDI+ произошла общая ошибка» при сохранении изображения

У меня была довольно проблема с этим. Вот мой код.

    int frame = 0;

    //This is a wpf button event
    private void up_Click(object sender, RoutedEventArgs e)
    {
        frame++;
        LoadPic();
    }
    private void LoadPic()
    {
        string fn = @"C:\Folder\image" + (frame % 2).ToString() + ".png";
        Bitmap bmp = new Bitmap(302, 170);
        bmp.Save(fn);
        bmp.Dispose();

        //Picebox is a wpf Image control
        Picbox.Source = new System.Windows.Media.Imaging.BitmapImage(new Uri(fn));
    }

    private void down_Click(object sender, RoutedEventArgs e)
    {
        frame--;
        LoadPic();
    }

Когда я запускаю программу, открывается окно wpf. Есть две кнопки с событиями, показанными в коде.

Когда я дважды нажимаю кнопку вверх, все работает нормально. Это сохраняет два PNG в местоположениях

"C:\Folder\image0.png" и "C:\Folder\image1.png"

В третий раз, когда я нажимаю кнопку, она должна снова сохраниться в «C:\Folder\image0.png». Вместо этого он выдает исключение «В GDI+ произошла общая ошибка».

У меня была похожая проблема раньше, и я решил ее, добавив эти две строки:

GC.Collect();
GC.WaitForPendingFinalizers();

На этот раз это не сработало.


person phil    schedule 21.09.2013    source источник
comment
Попробуйте закомментировать строку Picbox.Source = ... и посмотреть, сможет ли она сохранить ее. Я предполагаю, что изображение по какой-то причине заблокировано этой строкой.   -  person Karl-Johan Sjögren    schedule 21.09.2013
comment
Ты прав. Я забыл упомянуть, что   -  person phil    schedule 21.09.2013


Ответы (1)


Чтобы избежать блокировки файла, которую создает BitmapImage, вам нужно позаботиться о дополнительной инициализации. Согласно этот вопрос здесь, на SO, это можно сделать так (перенесено на C# из их кода VB.Net).

private void LoadPic()
{
    string fn = @"C:\Folder\image" + (frame % 2).ToString() + ".png";
    Bitmap bmp = new Bitmap(302, 170);
    bmp.Save(fn);
    bmp.Dispose();

    var img = new System.Windows.Media.Imaging.BitmapImage();
    img.BeginInit();
    img.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad;
    img.UriSource = new Uri(fn);
    img.EndInit();
    Picbox.Source = img;
}
person Karl-Johan Sjögren    schedule 21.09.2013