這彷佛是整個網絡上的一個臭名昭著的錯誤。 如此之多,以至於個人狀況不適合我,所以沒法找到解決問題的答案。 當我將圖像保存到流中時,將引起異常。 網絡
奇怪的是,這與png完美兼容,可是對於jpg和gif卻給出了上述錯誤,這很是使人困惑。 ui
那裏最相似的問題與未經許可將圖像保存到文件有關。 具備諷刺意味的是,解決方案是在執行操做時使用內存流。 this
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:
到目前爲止我嘗試過的事情還能夠。 spa
將圖像保存到位圖變量 code
using (var ms = new MemoryStream()) { Bitmap bmp = new Bitmap(imageToConvert); bmp.Save(ms, format); return ms.ToArray(); }
只是爲了提出另外一種可能的解決方案,我將說起遇到此錯誤消息的狀況。 保存我已轉換並顯示的位圖時, Bitmap.Save
方法將引起此異常。 我發現若是語句上有斷點,也不會引起異常;若是Thread.Sleep(500)
在Bitmap.Save
以前,它也不會引起異常,所以我認爲正在進行某種資源爭用。 orm
只需將圖像複製到新的Bitmap對象就足以防止出現此異常: 對象
new Bitmap(oldbitmap).Save(filename);
我注意到您的「 jpeg」案其實是: ip
default: format = ImageFormat.Jpeg; break;
您肯定格式爲jpeg而不是其餘格式嗎? 內存
我會嘗試:
case "image/jpg": // or "image/jpeg" ! format = ImageFormat.Jpeg; break;
或檢查實際返回的是imageToConvert.MimeType()
。
更新
您還須要對MemoryStream對象進行其餘初始化嗎?
好的,我彷佛只是因爲運氣而找到了緣由,而且該特定方法沒有任何問題,它進一步備份了調用堆棧。
以前我調整了圖像的大小,而且做爲該方法的一部分,我按以下方式返回了調整大小的對象。 我已經插入了對上述方法的兩個調用,並直接保存到文件中。
// 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; }
看來,該對象被建立在內存流必須是在保存對象時打開。 我不肯定爲何會這樣。 有誰能啓發我以及如何解決這個問題。
我只從流返回,由於在使用相似於此的調整大小代碼以後,目標文件具備未知的mime類型(img.RawFormat.Guid),而且Id但願Mime類型在全部圖像對象上都是正確的,由於它使很難寫泛型不然處理代碼。
編輯
這不是我最初的搜索時出現的,但這是喬恩·斯凱特(Jon Skeet)的回答
致使此錯誤的另外一個緣由-您在Bitmap實例的Save方法中指定的路徑不存在,或者您沒有提供完整/有效的路徑。
發生此錯誤是由於我傳入的是文件名而不是完整路徑!
它發生了!