GDI のメモリ ストリームに JPEG を保存するときに一般エラーが発生しました
GDI を使用して JPEG 画像をメモリ ストリームに保存すると、例外がスローされます。この問題は、PNG 画像ではなく JPEG および GIF 画像で発生するため、特に不可解です。
原因分析
このエラーの理由は、画像オブジェクトの保存中にメモリ ストリームを開いたままにする必要があるためです。これは、オブジェクトがストリームを使用して作成され、ストリームが閉じられたときにのみデータがフラッシュされるためです。
解決策
この問題を解決するには、画像が完全に保存されるまでメモリ ストリームを開いたままにしてください。次のコード スニペットは、正しいアプローチを示しています。
<code class="language-csharp">using (var ms = new MemoryStream()) { using (Image image = new Bitmap(...)) { ImageFormat format; switch (image.RawFormat) // 使用 RawFormat 代替 MimeType() { case ImageFormat.Png: format = ImageFormat.Png; break; case ImageFormat.Gif: format = ImageFormat.Gif; break; default: format = ImageFormat.Jpeg; break; } image.Save(ms, format); return ms.ToArray(); } }</code>
エラーメッセージの解釈
「GDI で一般的なエラーが発生しました」というあいまいな例外メッセージは、多くの開発者を混乱させます。ただし、このあいまいさの理由は、例外が GDI 自体によって発生するのではなく、システムの COM 相互運用層によって発生するためです。
代替案
画像の保存中にメモリ ストリームを開いたままにできない場合、別の解決策は、保存する前に元のメモリ ストリームから新しいメモリ ストリームを作成することです。
<code class="language-csharp"> using (var ms = new MemoryStream()) { // ... using (var newMs = new MemoryStream(ms.ToArray())) { image.Save(newMs, format); return newMs.ToArray(); } } ``` 该方法效率较低,应优先考虑第一种方法。 代码中也修正了使用 `RawFormat` 属性代替 `MimeType()` 方法,因为 `MimeType()` 方法在某些情况下可能无法正确返回图像格式。</code>
以上がGDI で JPEG を MemoryStream に保存すると「一般エラー」がスローされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。