【问题标题】:Dynamic graphs using C# (To be saved as a PNG Format)使用 C# 的动态图(保存为 PNG 格式)
【发布时间】:2016-03-01 09:50:31
【问题描述】:

我必须动态生成动态图表,将其保存为 PNG 图像格式(透明背景)以嵌入到 PDF 中。

问题是,图表不会显示在页面中的控件上(WebForm 中没有图表控件),应该从基础信息生成,并且应该在创建 PDF 时嵌入。

用于 PDF 和 PDF 生成的库已准备就绪。

我想知道如何在没有适当的图表控件的情况下生成动态图形(条形图、饼图)或简单图形,并能够将其保存为具有透明背景 (.PNG) 的图像。

原因是PDF模板有很多图层阴影,因此图形图像周围的背景应该是透明的,类似于下图。

我已尝试生成与以下链接中的示例类似的动态条形图,但图像看起来不太理想

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

非常感谢有关该功能的任何帮助。提前谢谢你。


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

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

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

在下面添加命名空间

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

下面的方法会给你如图所示边缘光滑的饼图

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

TaW。如果我错了,请纠正我。

【问题讨论】:

  • 我觉得不错!很高兴看到抗锯齿像素确实是半透明的! (我刚刚在 Photoshop 中检查了您的图像!)

标签: c# pdf graph


【解决方案1】:

不幸的是,图表不会直接绘制任何透明度,因此我们需要解决方法..

如果你想创建一个透明背景的 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);

首先我们将图表中的一些区域设置为独特的颜色;如果您在图表中使用紫红色(糟糕!),请选择其他颜色。

然后我们创建一个Bitmap 来保存图像。

现在我们关闭文本的抗锯齿;当我们将背景像素变为透明时,这有助于避免出现有趣的颜色。

现在我们告诉图表控件将自己绘制到我们的位图中。

最后,我们将所有具有我们特殊颜色的像素设为透明。

现在我们可以保存到磁盘了..

您可能需要考虑设置 dpi 分辨率和图表大小,以使结果在您的 pdf 中看起来不错!

更新:

如果您想创建图像而不实际显示Chart 控件,也没有真正的问题。事实上,您甚至可以在控制台应用程序中创建Chart 图像,如果您包含所有必要的命名空间等。

您需要做的就是在代码中创建Chart 并设置所有必要的属性。

这是一个最小的例子:

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的回复,但这不是如何创建饼图的问题,问题是如何在没有图表控件的情况下创建任何图表/图形,然后将其保存为图像具有透明背景。我已经相应地编辑了我的问题。谢谢你:)
  • 好的,我已经更新了答案。同样,由您决定使图表足够大并设置位图 dpi 以在 pdf 中创建清晰的结果..
  • 嘿Taw!感谢您的更新!我正忙于其他项目,因此无法处理您提供的更新。非常感谢!我确实采纳了您的建议和代码,使用所需的命名空间进行了一点修改,并且能够生成所需的图表!我已经相应地更新了问题的答案!再次!非常感谢您的帮助和跟进!干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 2021-05-08
  • 2017-04-24
  • 1970-01-01
相关资源
最近更新 更多