这似乎是一个臭名昭著的错误在整个网络。以至于我一直无法找到我的问题的答案,因为我的场景不适合。当我将图像保存到流中时,会抛出一个异常。

奇怪的是,这适用于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:\Users\Ian\SVN\Caldoo\Caldoo.Coordinator\PhotoEditor.cs:line 139
   at Caldoo.Web.Controllers.PictureController.Croppable() in C:\Users\Ian\SVN\Caldoo\Caldoo.Web\Controllers\PictureController.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: 

好的,到目前为止我已经试过了。

克隆图像并进行处理。 检索MIME的编码器,传递jpeg质量设置。


当前回答

对我来说,道路是错误的

就用这个

String path = Server.MapPath("~/last_img.png");//Path

其他回答

这个错误的另一个原因,解决我的problème是你的应用程序没有写权限的某些目录。

所以要完成savindra的回答:https://stackoverflow.com/a/7426516/6444829。

以下是授予IIS_IUSERS文件访问权的方法

提供对ASP的访问。NET应用程序时,必须将访问权限授予IIs_IUSERS。

为特定的文件或文件夹授予读、写和修改权限

In Windows Explorer, locate and select the required file. Right click the file, and then click Properties. In the Properties dialog box, click the Security tab. On the Security tab, examine the list of users. (If your application is running as a Network Service, add the network service account in the list and grant it the permission. In the Properties dialog box, click IIs_IUSERS, and in the Permissions for NETWORK SERVICE section, select the Read, Write, and Modify permissions. Click Apply, and then click OK.

这适用于我的IIS的windows server 2016和本地IIS windows 10。

可能导致这种错误的问题有:

目录不存在(您正在调用的方法不会自动为您创建此目录) 写入输出目录的安全权限不允许运行应用程序的用户写入

我希望这有助于,这是修复我的问题,我只是确保输出目录存在之前保存输出图像!

对我来说,道路是错误的

就用这个

String path = Server.MapPath("~/last_img.png");//Path

导致此错误的另一个原因-您在Bitmap实例的Save方法中指出的路径不存在或您没有提供完整/有效的路径。

刚刚有这个错误,因为我传递了一个文件名,而不是一个完整的路径!

它发生!

我的控制台应用程序得到了同样的错误消息:“GDI+中发生了一般性错误。” 错误发生在行newImage。保存参照以下代码。

for (int i = 1; i <= 1000; i++)
{
   Image newImage = Image.FromFile(@"Sample.tif");
   //...some logic here
   newImage.Save(i + ".tif", , ImageFormat.Tiff);
}

当RAM使用量在4GB左右时,程序返回错误,并通过在项目属性中将program Target更改为x64来解决该问题。