我有些代码在几台机器上都能完美运行(开发、QA、UAT)。但是,生产环境中我遇到了“GDI+ 中出现了通用错误”问题,原因是在bmp.Save(ms, ImageFormat.Png);
处。因此,我认为你们无法重现这个问题,但也许有人能发现我的错误。
需要注意的是,我已经搜索了很多常见解决方案,但由于保存到了MemoryStream
中,所以大多数人建议的文件权限问题并不适用;而像“bmp在打开时被锁定”的解决方案也不适用,因为我正在其他地方写入它。最后,这不是因为png需要可寻址流,因为MemoryStream
是可寻址的。
请注意,如果我将它更改为ImageFormat.Jpeg
,它就可以正常工作。我只在处理PNG时遇到了问题。我发现注册表键HKEY_CLASSES_ROOT\CLSID\{FAE3D380-FEA4-4623-8C75-C6B61110B681}
可能会因为权限问题而出现问题。因此,我设置了该键允许Everyone
对该键进行读取,但没有任何改变。
public static MemoryStream GenerateImage(string text)
{
MemoryStream ms = new MemoryStream();
using (Bitmap bmp = new Bitmap(400,400))
{
bmp.Save(ms, ImageFormat.Png);
ms.Position = 0;
}
return ms;
}
以下是完整的堆栈跟踪:
[ExternalException (0x80004005): GDI+ 中发生一般性错误。]
System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) +616457
WP.Tools.Img.GenerateImage(String text) +383
注意:我的问题已经列举了所提出的重复解决方案。 它们都不是问题的原因。 如果是这样,JPEG也会失败。