2013-09-21 3 views
0

У меня возникла проблема с этим. Вот мой код.«Общая ошибка в 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. Есть две кнопки с событиями, показанными в коде.

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

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

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

Я имел подобную проблему раньше, и решить ее, добавив следующие две строки:

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

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

+0

Попробуйте прокомментировать строку 'Picbox.Source = ...' и посмотреть, может ли она ее сохранить. Я предполагаю, что изображение по какой-то причине заблокировано этой строкой. –

+0

Вы правы. Я забыл упомянуть, что – phil

ответ

0

Чтобы избежать файлового замка, который создает BitmapImage, вам нужно позаботиться о большей инициализации. Согласно this question here on 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; 
} 
Смежные вопросы