ExternalException (0x80004005) GDI+通用错误
本文关键字:错误 GDI+ 0x80004005 ExternalException | 更新日期: 2023-09-27 18:06:08
我的程序有问题。我从SQL Server数据库读取byte[]
并将其保存为JPEG图像。
while (reader1.Read())
{
picBytes = null;
picBytes = (byte[])reader1.GetValue(0);
if (picBytes != null)
{
try
{
ms = new MemoryStream(picBytes, 0, picBytes.Length);
returnImage = Image.FromStream(ms, true);
returnImage.Save(@"path" + array[2] + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
returnImage.Dispose();
ms.Dispose();
}
catch (Exception e)
{
Console.WriteLine(e + array[2] + ".jpg");
}
}
}
我读到99%有权限错误,但500个图像被正确创建,50个没有。
这个错误只在Windows 7 64Bit下抛出…使用XP没有问题:
Error in System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
仍然有一些人有同样的问题,所以这里我是如何解决这个问题的:
- 螺杆系统。画
- 文件。WriteAllBytes (pathString picBytes);
我遇到了一个类似的问题,相同的代码对大多数图像都有效,但对某些图像产生了错误。作为一种变通方法,我发现从加载的图像中创建位图并保存位图适用于所有图像。在您的情况下,这意味着:
using(var bmp=new Bitmap(returnImage))
bmp.Save(@"path" + array[2] + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
我不知道为什么会这样,所以我对进一步的信息很感兴趣。
编辑:经过进一步的调查,问题(至少在我的情况下)似乎与图像中的EXIF数据有关。如果EXIF块的长度大于0xEFFF(即第一个字节是0xFF),则不能保存图像。所以从文件开头去掉EXIF块也解决了
当我运行我安装的程序时出现了这个错误,但在Visual Studio调试器中运行它时没有出现这个错误。错误码0x80004005表示权限错误。我怀疑Windows 7在某些情况下的读写权限比XP更严格,而Windows 10的限制肯定更严格。我能够通过以管理员身份运行程序来解决问题。然而,对于我打算分发的程序来说,这是不好的做法,所以我检查了代码,发现我试图在程序文件夹中编写一个临时emf文件,该文件在Windows 10中受到保护。我可以通过写入该程序的未受保护的ProgramData文件夹来解决这个问题,或者最好使用System.IO.Path.GetTempPath来获取临时文件的默认路径名。使用内存流是一个更好的解决方案。