![](/img/trans.png)
[英]Image.Save() throws exception "Value cannot be null./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生成的新縮略圖實際上將具有RawFormat
的MemoryBmp
,它沒有關聯的編碼器 - 因此您看到的是特定的錯誤消息。
只是不要使用thumb.RawFormat
; 既然你知道它是位圖,那么請使用ImageFormat.Bmp
。
PS請注意,雖然我刪除了我之前的答案,因為事實證明它與此特定問題無關,但正如文檔所指定的那樣,正確使用GetThumbnailImage
API仍然很重要; 您必須為callback
參數傳遞一個有效的委托而不是null
,否則它可能會失敗,您仍然需要在using
子句中包裝一次性用法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.