首页 > 解决方案 > 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());
            }

标签: c#winforms

解决方案


首先编写一个将图表转换为图像的方法:

    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);

推荐阅读