ExternalException(0x80004005)GDI +中发生一般错误

时间:2013-03-27 09:04:32

标签: c# .net image gdi+ filestream

我的程序有问题。我从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)

3 个答案:

答案 0 :(得分:2)

还有一些人有同样的问题,所以我在这里解决问题:

  • 螺丝系统。绘图

使用

  • File.WriteAllBytes(pathString,picBytes);

答案 1 :(得分:1)

我有一个类似的问题,相同的代码适用于大多数图像,并为一些人产生了错误。作为一种解决方法,我发现从加载的图像创建一个位图并保存位图适用于所有图像。在你的情况下,这意味着:

using(var bmp=new Bitmap(returnImage))
  bmp.Save(@"path" + array[2] + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

我不知道为什么会这样,所以我会对任何进一步的信息非常感兴趣。

编辑: 经过一些进一步的调查后,似乎问题(至少在我的情况下)与图像中的EXIF数据有关。如果EXIF块的长度大于0xEFFF(即第一个字节为0xFF),则无法保存图像。因此,从文件开头剥离EXIF块也可以解决问题

答案 2 :(得分:0)

运行安装的程序时出现此错误,但在Visual Studio调试器中运行该错误时却没有。错误代码0x80004005指示权限错误。我怀疑Windows 7在某些情况下比XP在读/写权限方面更特别,而Windows 10肯定更具限制性。我可以通过以管理员身份运行程序来解决我的问题。但是,对于我打算分发的程序而言,这是一种不好的做法,因此我检查了一下代码,发现我试图在程序文件夹中写入一个临时的emf文件,该文件在Windows 10中受到保护。我可以通过写入该程序的不受保护的ProgramData文件夹,或者最好使用System.IO.Path.GetTempPath来获取临时文件的默认路径名。使用内存流是一个更好的解决方案。