ホームページ > バックエンド開発 > C++ > イメージを MemoryStream に変換するときに「GDI で一般エラーが発生しました」が発生するのはなぜですか?

イメージを MemoryStream に変換するときに「GDI で一般エラーが発生しました」が発生するのはなぜですか?

Barbara Streisand
リリース: 2025-01-26 15:16:12
オリジナル
814 人が閲覧しました

Why Does

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 mimg が使用される前に破棄され、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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート