2016-12-19 2 views
0

J'utilise le code suivant pour comparer deux images et enregistrer le résultat. Dans la première manche, je crée avec succès et enregistrer l'image résultat, Mais dans la deuxième manche, je reçois l'exception suivante:C# only Deuxième bitmap.Save produire Une erreur générique s'est produite dans l'exception 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+. 

Le code:

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)); 

La ligne qui marque avec ** est la ligne qui lance l'exception dans la deuxième manche. déjà lu et essayé le fixer avec « l'aide » et .Dispose comme écrit ici: A Generic error occurred in GDI+ in Bitmap.Save method et ici: A generic error occurred in GDI+, JPEG Image to MemoryStream

Mais il ne fonctionne pas.

Par exemple, le code suivant ne fonctionne pas non plus:

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

Bien sûr l'image n'est pas ouverte ailleurs? – BugFinder

+0

tempImg ne peut pas être ouvert - J'ai créé une nouvelle instance et en l'invoquant également dans l'instruction "using" –

+0

qui ne vous empêche toujours pas de l'utiliser ailleurs – BugFinder

Répondre

1

Je ne sais pas pourquoi sauver le bitmap échoue, mais pas besoin d'en faire une bibliothèque Magick.NET bitmap.The a support pour la lecture et l'écriture d'images BMP. Voici un exemple de la façon dont vous pourriez changer votre code:

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)); 
    } 
}