首页 >后端开发 >C++ >为什么除非流保持打开状态,否则为什么将JPEG保存到GDI中的内存流中丢弃'通用错误”?

为什么除非流保持打开状态,否则为什么将JPEG保存到GDI中的内存流中丢弃'通用错误”?

Barbara Streisand
Barbara Streisand原创
2025-01-26 15:11:13361浏览

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

GDI JPEG 到 MemoryStream 转换错误:常见陷阱

本文解决了使用 GDI 将 JPEG 图像保存到 MemoryStream 时经常遇到的“通用 GDI 错误”。 虽然 PNG 可能可以完美运行,但 JPEG 经常会触发此异常。

问题: 在对 MemoryStream 进行 JPEG 保存操作期间发生错误,即令人沮丧的“通用 GDI 错误”。

根本原因:问题在于MemoryStream的生命周期管理。 在整个图像处理过程中,流必须保持打开状态,包括 Save 操作。

解决方案:关键是保持MemoryStream的打开状态。 这是更正后的代码片段:

<code class="language-csharp">using (var m = new MemoryStream())
{
    dst.Save(m, format); // Save to MemoryStream

    // Create a new Image from the MemoryStream (optional, depending on your needs)
    using (var img = Image.FromStream(m)) 
    {
        img.Save("C:\test.jpg"); // Save to file (optional)
        var bytes = PhotoEditor.ConvertImageToByteArray(img); //Convert to byte array (optional)
        return img; // Return the Image object
    }
}</code>

通过在 MemoryStream 块中保持 using 打开,直到不再需要 Image 对象,必要的资源仍然可以访问,从而防止错误。

解释: 确切的原因尚不清楚,但很可能 Image 对象维护了对原始 MemoryStream 的内部引用。过早关闭流会使该引用无效,从而导致 Save 操作期间出现 GDI 错误。

重要注意事项:

  • 使用 GDIPlusX 等扩展时也可能会出现此问题。
  • 始终确保 MemoryStream 保持打开状态,直到所有图像操作完成。
  • 对于从流返回 Image 对象的方法(例如 ResizingFirstOrDefault),请考虑首先保存到临时文件或另一个流,然后从保存的数据创建新的 Image 对象。

此方法可确保 GDI 应用程序中可靠的 JPEG 处理。

以上是为什么除非流保持打开状态,否则为什么将JPEG保存到GDI中的内存流中丢弃'通用错误”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn