2016-12-19 9 views
0

다음 코드를 사용하여 두 이미지를 비교하고 결과를 저장합니다. 첫 번째 실행에서 나는 성공적으로 생성하고 결과 이미지, 을 저장하지만 두 번째 실행에서 나는 다음과 같은 예외가 :C# only Second Bitmap.Save produce GDI + 예외에서 일반 오류가 발생했습니다.

An exception of type 'System.Runtime.InteropServices.ExternalException' occurred in System.Drawing.dll but was not handled in user code 

Additional information: A generic error occurred in GDI+. 

코드 :

MagickImage magickBaseImg = new MagickImage(new Bitmap(baseImageFileName)); 
MagickImage magickTargetImg = new MagickImage(new Bitmap(targetImageFileName)); 

var diffImg = new MagickImage(); 
magickBaseImg.Compare(magickTargetImg, ErrorMetric.RootMeanSquared, diffImg, Channels.Red); 

Bitmap ImgToSave = diffImg.ToBitmap(); 

DateTime currentTime = DateTime.Now; 
String differencesImageSavingPath = @"C:\test\DiffImage" + currentTime.ToString("ddMMyyyyHHmm") + ".bmp"; 
**ImgToSave.Save(differencesImageSavingPath, System.Drawing.Imaging.ImageFormat.Bmp);** 

differencesImageFileName = differencesImageSavingPath; 
DiffrenceImage.Source = new BitmapImage(new Uri(differencesImageFileName)); 

선으로 표시 ** 두 번째 실행에서 예외를 throw하는 행입니다. 이미 읽고 "사용"으로 고정 시도하고 .dispose 여기에 작성된 : 여기 A Generic error occurred in GDI+ in Bitmap.Save method 과 : A generic error occurred in GDI+, JPEG Image to MemoryStream

을하지만 그것은 작동하지 않습니다.

예를 들어, 다음 코드는 작동 중 하나를하지 않습니다

MagickImage magickBaseImg = new MagickImage(new Bitmap(baseImageFileName)); 
MagickImage magickTargetImg = new MagickImage(new Bitmap(targetImageFileName)); 

var diffImg = new MagickImage(); 
magickBaseImg.Compare(magickTargetImg, ErrorMetric.RootMeanSquared, diffImg, Channels.Red); 

Bitmap ImgToSave = diffImg.ToBitmap(); 

DateTime currentTime = DateTime.Now; 
String differencesImageSavingPath = @"C:\test\DiffImage" + currentTime.ToString("ddMMyyyyHHmm") + ".bmp"; 

using (var tempImg = new Bitmap(ImgToSave)) { 
    tempImg.Save(differencesImageSavingPath, System.Drawing.Imaging.ImageFormat.Bmp); 
} 

differencesImageFileName = differencesImageSavingPath; 
DiffrenceImage.Source = new BitmapImage(new Uri(differencesImageFileName)); 
+0

이미지가 다른 곳에서 열려 있지 않은지 확인하십시오. – BugFinder

+0

tempImg을 열 수 없습니다. 새 인스턴스를 생성하고 "사용"문장 –

+0

안에이 인스턴스를 호출해도 여전히 다른 곳에서 사용하지 못하도록합니다 – BugFinder

답변

1

을 내가 비트 맵을 절약 실패 이유를 잘 모르겠습니다 만은 bitmap.The Magick.NET 라이브러리가 필요가 없습니다 BMP 이미지 읽기 및 쓰기 지원. 다음은 코드를 변경하는 방법의 예입니다.

using (MagickImage magickBaseImg = new MagickImage(baseImageFileName)) 
using (MagickImage magickTargetImg = new MagickImage(targetImageFileName)) 
{ 
    using (var diffImg = new MagickImage()) 
    { 
    magickBaseImg.Compare(magickTargetImg, ErrorMetric.RootMeanSquared, diffImg, Channels.Red); 

    DateTime currentTime = DateTime.Now; 
    string differencesImageSavingPath = @"C:\test\DiffImage" + currentTime.ToString("ddMMyyyyHHmm") + ".bmp"; 
    diffImg.Save(differencesImageSavingPath); 

    differencesImageFileName = differencesImageSavingPath; 
    DiffrenceImage.Source = new BitmapImage(new Uri(differencesImageFileName)); 
    } 
}