【发布时间】:2017-05-04 09:17:58
【问题描述】:
我正在使用以下代码在两个图像之间进行比较并保存结果。 在第一次运行中,我成功创建并保存了结果图像, 但在第二次运行中,我得到以下异常:
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));
带有**标记的行是在第二次运行时抛出异常的行。 已经阅读并尝试使用“使用”和 .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));
【问题讨论】:
-
确定图片没有在其他地方打开?
-
tempImg 无法打开 - 我创建了一个新实例并在“使用”语句中调用它
-
这仍然不妨碍您在其他地方使用它
-
你读过它,但它仍然是同样的原因。使用 using 和 Dispose 确实没有帮助。 - 见here
-
您多久调用一次该方法?当您将图像保存为带有分钟的文件名并将其分配给 DifferenceImage.Source 时,它可能已打开并因此受到写保护。如果您在不同的分钟内调用该方法,则可能不会发生错误。