MemoryStream にイメージを保存するときの GDI「一般エラー」: 解決策
GDI を使用して JPG または GIF 画像を MemoryStream
に変換すると、不可解な「GDI で一般エラーが発生しました」例外がスローされることがあります。 これは通常、image.Save()
中に発生します。根本的な原因は、多くの場合、早期に閉じられた MemoryStream
です。
重要なのは、画像の保存プロセス全体を通じて MemoryStream
が開いたままであることを確認することです。 画像はストリームから作成され、保存するには継続的なアクセスが必要です。
次の問題のあるコード スニペットを考えてみましょう:
<code class="language-csharp">using (var m = new MemoryStream()) { dst.Save(m, format); var img = Image.FromStream(m); // MemoryStream 'm' is closed here! img.Save("C:\test.jpg"); // This often fails. return img; }</code>
MemoryStream
m
は img
が使用される前に破棄され、GDI エラーが発生します。
解決策は簡単です。画像が完全に処理されるまでストリームを開いたままにします。 修正されたコードは次のとおりです:
<code class="language-csharp">using (var m = new MemoryStream()) { dst.Save(m, format); m.Seek(0, SeekOrigin.Begin); // Rewind the stream var img = Image.FromStream(m); img.Save("C:\test.jpg"); // This should now work. return img; }</code>
m.Seek(0, SeekOrigin.Begin)
を使用することで、ストリームの位置を先頭にリセットし、Image.FromStream
が保存された画像データにアクセスできるようにします。 using
ステートメントは、画像が正常に処理されて返された後に MemoryStream
を適切に破棄することを保証します。 これにより、リソース リークが防止され、GDI の「一般エラー」が解決されます。
以上がイメージを MemoryStream に変換するときに「GDI で一般エラーが発生しました」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。