2012-01-31 30 views
14

画像をMemoryStreamに保存しようとしていますが、特定の条件下では失敗しています。ここImage.Saveクラッシュ:{"値はnullではありません。 r nパラメータ名:エンコーダ"}

コードである:

次のコードが成功:

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

次のコードが失敗した:第二のスニペットはImage.GetThumbnailImageを使用して作成された画像を使用していること

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. 

注意。

違いは何ですか?なぜ誰がそれが失敗しているか考えている人はいますか?

答えて

22

私はこの問題はGetThumbnailImage documentationのこの部分に関係していると信じて:

Imageが埋め込まれたサムネイル画像が含まれている場合は、この方法は、埋め込まれたサムネイルを取得し、要求されたサイズにスケーリングします。 Imageに埋め込みサムネイル画像が含まれていない場合、このメソッドはメイン画像を拡大縮小してサムネイル画像を作成します。

これはおそらく間欠的な動作(「特定の条件」)を説明していると考えられます。説明は次のとおりですMicrosoft Connect ticket

基本APIはMemoryBmpイメージタイプのエンコーダを特定できません。これをGDI +チームが調査する必要があります。それまでの間はImageFormatをImageFormat.MemoryBmpではなくImageFormat.Bmpに変更するだけで動作するはずです。 BMP形式を使用してMemoryStreamに保存されます。すべての可能性で

何埋め込まれたサムネイルが存在しない場合は、GetThumbnailImage APIによって生成された新しいサムネイルが何の関連するエンコーダがないMemoryBmpRawFormat持っているつもり実際にある - あなたが見ているので、特定のエラーメッセージを。

thumb.RawFormatを使用しないでください。とにかくビットマップだと分かっているので、代わりにImageFormat.Bmpを使用してください。

P.S.この特定の問題に関連しないことが判明したため私の以前の回答は削除されましたが、ドキュメントが指定するとおり、GetThumbnailImage APIを適切に使用することは重要です。 nullではなくcallbackパラメータの有効なデリゲートをに渡す必要があります。それ以外の場合は失敗し、依然としてusing句に消耗品をラップする必要があります。

+1

'thumb.Save(ms、thumb.RawFormat)'を 'thumb.Save(ms、thumb.Bmp)'に変更しました! – agarcian

関連する問題