首頁 >後端開發 >C++ >為什麼在 GDI 中將 JPEG 儲存到 MemoryStream 會引發「一般錯誤」?

為什麼在 GDI 中將 JPEG 儲存到 MemoryStream 會引發「一般錯誤」?

Linda Hamilton
Linda Hamilton原創
2025-01-26 15:26:09909瀏覽

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

GDI 保存 JPEG 到記憶體流時出現通用錯誤

使用 GDI 將 JPEG 影像儲存到記憶體流時,會引發異常。這個問題尤其令人費解,因為它發生在 JPEG 和 GIF 影像上,但不會發生在 PNG 影像上。

原因分析

此錯誤的原因在於,在儲存影像物件時,記憶體流必須保持開啟狀態。這是因為該物件是用流創建的,並且只有在關閉流時才會刷新資料。

要解決此問題,請確保記憶體流在影像完全保存之前保持開啟。以下程式碼片段示範了正確的方法:

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn