GDI +,JPEG圖像到MemoryStream中發生通常錯誤

這彷佛是整個網絡上的一個臭名昭著的錯誤。 如此之多,以至於個人狀況不適合我,所以沒法找到解決問題的答案。 當我將圖像保存到流中時,將引起異常。 網絡

奇怪的是,這與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

  1. 克隆圖像並進行處理。
  2. 檢索該MIME的編碼器,並使用jpeg質量設置傳遞該編碼器。

#1樓

將圖像保存到位圖變量 code

using (var ms = new MemoryStream())
{
    Bitmap bmp = new Bitmap(imageToConvert);
    bmp.Save(ms, format);
    return ms.ToArray();
}

#2樓

只是爲了提出另外一種可能的解決方案,我將說起遇到此錯誤消息的狀況。 保存我已轉換並顯示的位圖時, Bitmap.Save方法將引起此異常。 我發現若是語句上有斷點,也不會引起異常;若是Thread.Sleep(500)Bitmap.Save以前,它也不會引起異常,所以我認爲正在進行某種資源爭用。 orm

只需將圖像複製到新的Bitmap對象就足以防止出現此異常: 對象

new Bitmap(oldbitmap).Save(filename);

#3樓

我注意到您的「 jpeg」案其實是: ip

default:
                format = ImageFormat.Jpeg;
                break;

您肯定格式爲jpeg而不是其餘格式嗎? 內存

我會嘗試:

case "image/jpg": // or "image/jpeg" !
                format = ImageFormat.Jpeg;
                break;

或檢查實際返回的是imageToConvert.MimeType()

更新

您還須要對MemoryStream對象進行其餘初始化嗎?


#4樓

好的,我彷佛只是因爲運氣而找到了緣由,而且該特定方法沒有任何問題,它進一步備份了調用堆棧。

以前我調整了圖像的大小,而且做爲該方法的一部分,我按以下方式返回了調整大小的對象。 我已經插入了對上述方法的兩個調用,並直接保存到文件中。

// 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)的回答


#5樓

致使此錯誤的另外一個緣由-您在Bitmap實例的Save方法中指定的路徑不存在,或者您沒有提供完整/有效的路徑。

發生此錯誤是由於我傳入的是文件名而不是完整路徑!

它發生了!

相關文章
相關標籤/搜索