使用C#生成动态图表(保存为PNG格式)

4
我需要在运行时生成动态图表,将其保存为PNG图像格式(透明背景),并嵌入PDF中。问题是,在页面上没有控件(WebForm中没有图表控件)显示图表,应该从基础信息生成并在创建PDF时嵌入。
PDF和PDF生成的库已经就位。我想知道如何生成动态图表(条形图、饼图)3D或简单图表,而不需要放置图表控件,并能将其保存为带有透明背景的图像(.PNG)。原因是,PDF模板具有众多层次阴影,因此图像周围的背景应该是透明的,类似于下面的图像。

Possible Graph

我尝试生成一个类似下面链接中的动态条形图,但是图片效果不太理想。

https://2leggedspider.wordpress.com/2004/11/21/generating-a-dynamic-bar-graph-using-aspnet-and-c/

Graph implemented

任何有关功能的帮助都会深受赞赏。提前感谢您。

更新:2016年3月16日星期三

有了TaW的答案和更新,我已经能够绘制所需的图表,以下是对我提出的同样问题的答案的更新

添加对System.Windows.FormsSystem.Windows.Forms.DataVisualization的引用

添加以下命名空间

using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

以下方法将为您提供具有平滑边缘的饼图,如图所示。

Pie Chart with Smooth Edges

void Create3DPieChart()
        {
            /* Utilize the Chart class available in System.Windows.Forms.DataVisualization.Charting */
            Chart chart = new Chart();
            /* Add a chart area to the chart */
            ChartArea CA = chart.ChartAreas.Add("A1");
            /* Add data series to the chart and specify the type of Series */
            Series S1 = chart.Series.Add("S1");
            S1.ChartType = SeriesChartType.Pie;

            /* Assign points for the Series */
            S1.Points.AddXY(1, 17);
            S1.Points.AddXY(2, 27);
            S1.Points.AddXY(3, 7);
            S1.Points.AddXY(4, 49);

            /* Set chart color and other settings as required */
            chart.BackColor = Color.Transparent;
            CA.BackColor = chart.BackColor;
            CA.Area3DStyle.Enable3D = true;
            S1.Points[2]["Exploded"] = "true";

            /*Assign AntiAliasing to Graphics style for smooth edges*/
            chart.AntiAliasing = AntiAliasingStyles.Graphics;

            /* Set the image path and save the image as PNG format*/
            string imageNameAndPath = string.Concat(Application.StartupPath.Remove(Application.StartupPath.IndexOf("\\bin\\Debug")), 
                                        "/TempImages/Image", DateTime.Now.ToString("ddMMyyyyhhmmss") + ".png");
            chart.SaveImage(imageNameAndPath, ChartImageFormat.Png);
        }
。如果我错了,请纠正我。

1
看起来不错!很高兴看到抗锯齿像素确实是半透明的!(我刚在Photoshop中检查了你的图像!) - TaW
1个回答

3

很遗憾,图表无法直接绘制透明度,因此我们需要解决方法。

如果您想创建具有透明背景的PNG图片,可以执行以下操作:

chart1.BackColor = Color.Fuchsia;
chart1.ChartAreas[0].BackColor = chart1.BackColor;
Bitmap bmp = new Bitmap( chart1.ClientSize.Width, chart1.ClientSize.Height);
chart1.AntiAliasing = AntiAliasingStyles.Graphics;
chart1.DrawToBitmap(bmp, chart1.ClientRectangle);
bmp.MakeTransparent(chart1.BackColor);
bmp.Save(yourFileName, ImageFormat.Png);

首先,我们将图表中的一些区域设置为唯一的颜色;如果你在图表中使用紫红色(呕吐!),那么选择其他颜色。
然后,我们创建一个位图来容纳图像。
现在,我们关闭文本的反锯齿效果;这有助于避免在将背景像素转换为透明时出现奇怪的颜色。
现在,我们告诉图表控件将自己绘制到我们的位图中。
最后,我们使所有具有特殊颜色的像素变成透明。
现在我们可以保存到磁盘上。
您可能需要了解如何设置dpi分辨率和图表大小,以使结果在pdf中看起来很好!
更新:
如果您想创建图像而不实际显示图表控件,则也没有真正的问题。事实上,即使在控制台应用程序中,您甚至可以创建一个图表图像,只要包含所有必要的命名空间等。
您需要做的就是在代码中创建图表并设置所有必要的属性。
以下是一个最小示例:

enter image description here

Chart chart = new Chart();
ChartArea CA = chart.ChartAreas.Add("A1");
Series S1 = chart.Series.Add("S1");
S1.ChartType = SeriesChartType.Pie;

S1.Points.AddXY(1, 17);
S1.Points.AddXY(2, 27);
S1.Points.AddXY(3, 7);
S1.Points.AddXY(4, 49);

chart.BackColor = Color.Fuchsia;
CA.BackColor = chart.BackColor;
CA.Area3DStyle.Enable3D = true;
S1.Points[2]["Exploded"] = "true";
Bitmap bmp = new Bitmap(chart.Width, chart.Height);
chart.AntiAliasing = AntiAliasingStyles.None;
chart.DrawToBitmap(bmp, chart.ClientRectangle);
bmp.MakeTransparent(chart.BackColor);
bmp.Save(yourFileName, ImageFormat.Png);

感谢您的回复,TaW。但问题并不是如何创建饼状图,而是如何在没有图表控件的情况下创建任何图表/图形,并将其保存为具有透明背景的图像。我已相应地编辑了我的问题。谢谢 :) - CodeTantric
好的,我已经更新了答案。再次提醒您,需要您自己将图表放大到足够的尺寸,并设置位图的dpi以在pdf中获得清晰的结果。 - TaW
嘿Taw!谢谢你的更新!我忙于其他项目,因此无法处理你提供的更新。非常感谢!我采纳了你的建议和代码,稍作修改,加上必要的命名空间,成功生成了所需的图形!我已经相应地更新了问题的答案!再次感谢你的帮助和跟进!干杯! - CodeTantric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接