嗨,当我试图将'System.Runtime.InteropServices.ExternalException文件保存到一个内存流时,我将跟踪异常System.Drawing.Image.Save‘。
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,我已经在做了。
有什么建议吗?
发布于 2022-04-26 11:59:02
正如Klausütter在评论中提到的,您不允许在位图之前释放流。
解决这一问题的一个选择是返回位图的无性系,这将确保将所有像素数据复制到单独的缓冲区中,从而允许释放原始流。
using var bmp = new Bitmap(memoryStream);
images.Add(bmp.Clone(new Rectangle(0,0, bmp.Width, bmp.Height), PixelFormat.Format32bppArgb);
另一种选择可能是不释放内存流。由于MemoryStream只代表一大块托管内存,因此依赖垃圾收集器进行清理是安全的。一个好的经验法则是始终释放一次性对象,但当您知道对象只拥有托管资源(如内存)时,这一点就不那么重要了。
https://stackoverflow.com/questions/72010973
复制相似问题