ホームページ > バックエンド開発 > C++ > GDI で JPEG を MemoryStream に保存すると「一般エラー」がスローされるのはなぜですか?

GDI で JPEG を MemoryStream に保存すると「一般エラー」がスローされるのはなぜですか?

Linda Hamilton
リリース: 2025-01-26 15:26:09
オリジナル
848 人が閲覧しました

Why Does Saving a JPEG to a MemoryStream in GDI  Throw a

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 サイトの他の関連記事を参照してください。

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