在GDI +,JPEG Image到MemoryStream中发生了一般性错误

这似乎是整个网络上的一个臭名昭着的错误。 因为我的情况不适合,所以我一直无法找到我的问题的答案。 将图像保存到流中时会引发异常。

奇怪的是,这与PNG完美的结合,但给出了上述错误与JPG和GIF这是相当混乱。

那里的大部分类似问题都与将图像保存到没有权限的文件有关。 讽刺的是,解决方案是使用一个内存流,因为我正在做...

public static byte[] ConvertImageToByteArray(Image imageToConvert)
{
    using (var ms = new MemoryStream())
    {
        ImageFormat format;
        switch (imageToConvert.MimeType())
        {
            case "image/png":
                format = ImageFormat.Png;
                break;
            case "image/gif":
                format = ImageFormat.Gif;
                break;
            default:
                format = ImageFormat.Jpeg;
                break;
        }

        imageToConvert.Save(ms, format);
        return ms.ToArray();
    }
}

例外的更多细节。 造成这么多问题的原因是缺乏解释:(

System.Runtime.InteropServices.ExternalException was unhandled by user code
Message="A generic error occurred in GDI+."
Source="System.Drawing"
ErrorCode=-2147467259
StackTrace:
   at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters    encoderParams)
   at System.Drawing.Image.Save(Stream stream, ImageFormat format)
   at Caldoo.Infrastructure.PhotoEditor.ConvertImageToByteArray(Image imageToConvert) in C:UsersIanSVNCaldooCaldoo.CoordinatorPhotoEditor.cs:line 139
   at Caldoo.Web.Controllers.PictureController.Croppable() in C:UsersIanSVNCaldooCaldoo.WebControllersPictureController.cs:line 132
   at lambda_method(ExecutionScope , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
 InnerException: 

好的,我已经尝试过。

  • 克隆图像并开展工作。
  • 为jpeg质量设置传回那个MIME的编码器。

  • 好吧,我似乎已经找到了原因,只是运气很好,它没有错那个特定的方法,它进一步支持调用堆栈。

    之前我调整了图像的大小,并且作为该方法的一部分,我按照以下方式返回调整大小的对象。 我已经插入了两个调用上述方法并直接保存到文件。

    // At this point the new bitmap has no MimeType
    // Need to output to memory stream
    using (var m = new MemoryStream())
    {
           dst.Save(m, format);
    
           var img = Image.FromStream(m);
    
           //TEST
           img.Save("C:test.jpg");
           var bytes = PhotoEditor.ConvertImageToByteArray(img);
    
    
           return img;
     }
    

    看来,该对象被创建的内存流必须是在保存对象时打开。 我不确定这是为什么。 有没有人能够启发我,我怎样才能解决这个问题。

    我只从流中返回,因为在使用与此类似的resize代码之后,目标文件具有未知的MIME类型(img.RawFormat.Guid),并且像MIME类型一样,Id在所有图像对象上都是正确的,因为它使其难以写入通用否则处理代码。

    编辑

    这并没有出现在我最初的搜索中,但这是Jon Skeet的答案


    如果你得到这个错误,那么我可以说你的应用程序没有对某个目录的写权限。

    例如,如果您尝试将图像从内存流保存到文件系统,则可能会出现该错误。

    如果您使用的是XP,请确保为该文件夹上的aspnet帐户添加写入权限。

    如果您使用Windows Server(2003,2008)或Vista,请确保为网络服务帐户添加写入权限。

    希望它有助于某个人。


    我会添加这个错误的原因,希望它可以帮助未来的一些互联网旅行者。 :)

    GDI +将图像的最大高度限制为65500

    我们做了一些基本的图像大小调整,但在调整大小时,我们尝试保持宽高比。 我们有一位在这份工作上表现出色的QA人, 他决定用480像素高的ONE像素宽的照片来测试它。 当图像缩放以符合我们的尺寸时,高度在68,000像素以北,我们的应用程序爆炸了。 A generic error occurred in GDI+

    你可以用测试自己验证一下:

      int width = 480;
      var height = UInt16.MaxValue - 36; //succeeds at 65499, 65500
      try
      {
        while(true)
        {
          var image = new Bitmap(width, height);
          using(MemoryStream ms = new MemoryStream())
          {
            //error will throw from here
            image.Save(ms, ImageFormat.Jpeg);
          }
          height += 1;
        }
      }
      catch(Exception ex)
      {
        //explodes at 65501 with "A generic error occurred in GDI+."
      }
    

    这太糟糕了,在Bitmap的构造函数中没有友好的.net ArgumentException异常。

    链接地址: http://www.djcxy.com/p/50287.html

    上一篇: A generic error occurred in GDI+, JPEG Image to MemoryStream

    下一篇: What can I use for good quality Code Coverage for C#/.NET?