GDI+中发生一般性错误(asp.net(C#))

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GDI+中发生一般性错误(asp.net(C#))相关的知识,希望对你有一定的参考价值。

我是在上传图片文件同时给本文件生成水印,就出现这个错!麻烦高手..! 是的,我就是想覆盖原有图片保存,但我就是不想另存水印图片和删除原图片,如果这样我已经解决了!

参考技术A 应该是你
想覆盖原有图片保存吧。这时候会报错不知道你但是不是这个原因。你可以另存好生成水印的图片,然后删除原图。
需要我给你
一个我
常用的水印类。
参考技术B 常见情况是文件夹权限不足
将生成的文件所在目录添加NETWORD_SERVICE,写入权限

c# only Second Bitmap.Save 产生 GDI+ 异常中发生一般错误

【中文标题】c# only Second Bitmap.Save 产生 GDI+ 异常中发生一般错误【英文标题】:c# only Second Bitmap.Save produce A generic error occurred in GDI+ exception 【发布时间】: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 时,它​​可能已打开并因此受到写保护。如果您在不同的分钟内调用该方法,则可能不会发生错误。 【参考方案1】:

我不确定为什么保存位图会失败,但不需要将其设为位图。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));
  

【讨论】:

以上是关于GDI+中发生一般性错误(asp.net(C#))的主要内容,如果未能解决你的问题,请参考以下文章

使用带有内存流的 c# 在控制台应用程序中保存图像时,GDI + 中发生一般错误

.net c#的图片保存时发生"gdi+发生一般性错误"

c#中利用system.timers多线程做图像处理,图像保存时提示“GDI+ 中发生一般性错误”,如何解决?

求教:C#中winform 并未使用任何图片,但报错”GDI+ 中发生一般性错误“

用vs2010编写C#程序,将图片保存到一个文件夹中,下次循环覆盖保存,提示gdi+中发生一般性错误。。。

GDI+中发生一般性错误