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 창이 열립니다. 코드에 표시된 이벤트와 함께 두 개의 버튼이 있습니다.

위로 단추를 두 번 누르면 잘 작동합니다. "

I 버튼을 누르면 세 번째 시간, 그것으로 저장해야합니다 :와"\ 폴더 \ image1.png C ":이 위치

"\ 폴더 \ image0.png C "두 PNG 파일 저장 C : \ Folder \ image0.png "를 다시 입력하십시오. 대신 'GDI +에서 일반적인 오류가 발생했습니다.'예외가 발생합니다.

는 내가 전에 비슷한 문제가 있고,이 두 줄을 추가하여 해결 한 :이 시간을 작동하지 않았다

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

.

+0

'Picbox.Source = ...'행을 주석 처리하고 저장 가능 여부를 확인하십시오. 내 생각 엔 이미지가 그 행에 의해 어떤 이유로 든 잠겨있을 것입니다. –

+0

정확합니다. 나는 그 말을 잊어 버렸다. – phil

답변

0

BitmapImage이 생성하는 파일 잠금을 피하려면 조금 더 초기화해야합니다. this question here on SO에 따르면이 작업은 VB.Net 코드에서 C#으로 이식 할 수 있습니다.

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; 
} 
관련 문제