c# - C# 将多个图表保存到一个图像中
问题描述
目前我正在尝试开发一个在流面板布局上显示多个图表控件的winform。我知道如何将图表控件一一保存,但是如何将多个图表控件保存为一种图像格式(例如png/jpg)?我尝试先将它们保存在流中,但无法将它们全部保存到一个图像中。
请指导我处理它。谢谢
代码 :
try
{
if (dgvDataLog.Rows.Count > 0)
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Title = "Save PNG Files";
saveFileDialog1.CheckPathExists = true;
saveFileDialog1.DefaultExt = "png";
saveFileDialog1.Filter = "PNG files (*.png)|*.png";
saveFileDialog1.FilterIndex = 2;
saveFileDialog1.RestoreDirectory = true;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
using (var chartimage = new MemoryStream())
{
tabPageChart1.SaveImage(chartimage, ChartImageFormat.Png);
tabPageChart2.SaveImage(chartimage, ChartImageFormat.Png);
tabPageChart3.SaveImage(chartimage, ChartImageFormat.Png);
}
MessageBox.Show("Image Saved At " + saveFileDialog1.FileName, "INFORMATION", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
else
{
MessageBox.Show("No Record To Be Export.", "INFORMATION", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
catch (SystemException errMsg)
{
MessageBox.Show(errMsg.ToString());
}
解决方案
首先编写一个将图表转换为图像的方法:
List<Image> ChartsToImages(List<Chart> charts)
{
var imageList = new List<Image>();
foreach (var c in charts)
{
using (var ms = new MemoryStream())
{
c.SaveImage(ms, ChartImageFormat.Png);
var bmp = System.Drawing.Bitmap.FromStream(ms);
imageList.Add(bmp);
}
}
return imageList;
}
然后是一种将所有图像拼接在一起的方法:
private static Image MergeImages(List<Image> imageList)
{
var finalSize = new Size();
foreach (var image in imageList)
{
if (image.Width > finalSize.Width)
{
finalSize.Width = image.Width;
}
finalSize.Height += image.Height;
}
var outputImage = new Bitmap(finalSize.Width, finalSize.Height);
using (var gfx = Graphics.FromImage(outputImage))
{
var y = 0;
foreach (var image in imageList)
{
gfx.DrawImage(image, 0, y);
y += image.Height;
}
}
return outputImage;
}
最后,把它们放在一起:
var chartList = new List<Chart> {tabPageChart1, tabPageChart2, tabPageChart3};
var imageList = ChartsToImages(chartList);
var finalImage = MergeImages(imageList);
finalImage.Save("C:\\Junk\\Junk.png", ImageFormat.Png);
推荐阅读
- html - 如何使标题文本的一部分使用不同的字体并在整个标题文本周围添加破折号?
- reactjs - 当我在路由器文件夹中添加快递时反应错误
- javascript - 使用 JavaScript 将 x em 添加到字体大小?
- azure-web-app-service - 登录页面包括“使用现有帐户登录”标题,然后为 Azure B2C 删除
- javascript - 可以从react js重复调用api吗
- android - 无法序列化 DslActivationStatus 状态...Android Studio
- python-3.x - 按季度平均分组并获取在平均计算中使用的值 -pandas
- git - 仅将具有历史记录的 TFS 存储库的一部分迁移到 Git azure devops
- javascript - 如何在 HTML5 中打开文件夹
- python - 你能解释一下 keras 模型中 tensorflow 加载和 hdf5 加载之间的区别吗