首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将图像保存到GDI+时,MemoryStream中发生了一个泛型错误

将图像保存到GDI+时,MemoryStream中发生了一个泛型错误
EN

Stack Overflow用户
提问于 2022-04-26 08:46:33
回答 1查看 356关注 0票数 0

嗨,当我试图将'System.Runtime.InteropServices.ExternalException文件保存到一个内存流时,我将跟踪异常System.Drawing.Image.Save‘。

代码语言:javascript
运行
复制
images = new List<Bitmap>(seriesDataList.Count());

foreach (var seriesData in seriesDataList)
{
    using (chart = new Chart { Width = ChartWidth, Height = ChartHeight })
    {
        chart.ChartAreas.Add(new ChartArea(seriesData.Key));

        var series = new Series(seriesData.Key)
        {
            ChartType = SeriesChartType.Doughnut,
            Font = ChartTextFont,
            LegendText = "#VALX (#PERCENT)",
        };

        BindSeriesData(seriesData.ToList(), series);
        series["PieLabelStyle"] = seriesData.Count() <= MaxValuesForShowingLabels ? "Outside" : "Disabled";
        series["PieLineColor"] = "Black";
        chart.Series.Add(series);

        var legend = new Legend(seriesData.Key)
        {
            Enabled = true,
            Font = ChartTextFont,
            Docking = Docking.Right,
            Title = seriesData.Key,
            TitleFont = ChartTitleFont,
            TitleAlignment = StringAlignment.Near
        };

        chart.Legends.Add(legend);

        using (var memoryStream = new MemoryStream())
        {
            chart.SaveImage(memoryStream, ChartImageFormat.Jpeg); // Working fine
            images.Add(new Bitmap(memoryStream));
        }
    }
}

using (var fullImage = MergeImages(images))
           {
                using (var memoryStream = new MemoryStream())
                {
                    fullImage.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); // ERROR HERE
                    return Convert.ToBase64String(memoryStream.ToArray());
                }
            }

在其他情况下,完整的映像不是由许多图像构建的,流程是工作的。仅对于此图像类型,它在低速率下失败。看到了其他相关的问题,建议用‘使用’来包装memoryStream,我已经在做了。

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-26 11:59:02

正如Klausütter在评论中提到的,您不允许在位图之前释放流。

解决这一问题的一个选择是返回位图的无性系,这将确保将所有像素数据复制到单独的缓冲区中,从而允许释放原始流。

代码语言:javascript
运行
复制
using var bmp = new Bitmap(memoryStream);
images.Add(bmp.Clone(new Rectangle(0,0, bmp.Width, bmp.Height), PixelFormat.Format32bppArgb);

另一种选择可能是不释放内存流。由于MemoryStream只代表一大块托管内存,因此依赖垃圾收集器进行清理是安全的。一个好的经验法则是始终释放一次性对象,但当您知道对象只拥有托管资源(如内存)时,这一点就不那么重要了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72010973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档