簡體   English   中英

Image.Save崩潰:{“值不能為空。\\ r \\ nParameter name:encoder”}

[英]Image.Save crashing: {“Value cannot be null.\r\nParameter name: encoder”}

我試圖將圖像保存到MemoryStream但在某些條件下失敗。

這是代碼:

以下代碼成功:

Image img = Bitmap.FromStream(fileStream);
MemoryStream ms = new MemoryStream();
img.Save(ms, img.RawFormat);  // This succeeds.

以下代碼失敗:

Image img = Bitmap.FromStream(fileStream);
Image thumb = img.GetThumbnailImage(thumbWidth, thumbHeight, null, System.IntPtr.Zero);

MemoryStream ms = new MemoryStream();
thumb.Save(ms, thumb.RawFormat);  // This fails.

請注意,第二個代碼段使用的是使用Image.GetThumbnailImage創建的圖像。

有什么不同? 有誰知道它為什么失敗?

我相信這個問題與GetThumbnailImage文檔的這一部分有關:

如果圖像包含嵌入的縮略圖圖像,則此方法將檢索嵌入的縮略圖並將其縮放到請求的大小。 如果圖像不包含嵌入的縮略圖圖像,則此方法通過縮放主圖像來創建縮略圖圖像。

這可能是間歇性行為(AKA“某些條件”)的原因。 解釋在以下Microsoft Connect票證中

底層API無法為MemoryBmp圖像類型定位編碼器。 我們需要對GDI +團隊進行調查。 在此期間,您應該能夠簡單地將ImageFormat更改為ImageFormat.Bmp而不是ImageFormat.MemoryBmp,它應該可以工作。 它仍將使用BMP格式保存到MemoryStream。

很有可能,如果沒有嵌入的縮略圖, GetThumbnailImage API生成的新縮略圖實際上將具有RawFormatMemoryBmp ,它沒有關聯的編碼器 - 因此您看到的是特定的錯誤消息。

只是不要使用thumb.RawFormat ; 既然你知道它是位圖,那么請使用ImageFormat.Bmp

PS請注意,雖然我刪除了我之前的答案,因為事實證明它與此特定問題無關,但正如文檔所指定的那樣,正確使用GetThumbnailImage API仍然很重要; 必須callback參數傳遞一個有效的委托而不是null ,否則它可能會失敗,您仍然需要在using子句中包裝一次性用法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM