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)

ExternalException (0x80004005) GDI+通用错误

仍然有一些人有同样的问题,所以这里我是如何解决这个问题的:

  • 螺杆系统。画
使用

  • 文件。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来获取临时文件的默认路径名。使用内存流是一个更好的解决方案。