在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:
好的,我已经尝试过。
好吧,我似乎已经找到了原因,只是运气很好,它没有错那个特定的方法,它进一步支持调用堆栈。
之前我调整了图像的大小,并且作为该方法的一部分,我按照以下方式返回调整大小的对象。 我已经插入了两个调用上述方法并直接保存到文件。
// 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
异常。
上一篇: A generic error occurred in GDI+, JPEG Image to MemoryStream
下一篇: What can I use for good quality Code Coverage for C#/.NET?