如何调整图表大小超过屏幕分辨率?

3

我有一个使用C# 4.7 WinForms的应用程序,其中包含一条线图。我想保存具有非常大分辨率(例如10000x2000)的图表图像。以下是我的做法:

Form1.Width = 3860; //my screen width resolution - maximum allowed
Form1.Height = 1080; //my screen height resolution - maximum allowed
chart1.Dock = DockStyle.Fill;
chart1.SaveImage(saveFile.FileName, ChartImageFormat.Jpeg);

这段代码保存了分辨率为3860x1080的jpeg图像,我可以将其缩放到需要的点。但这还不够,我想要将我的表格或图表放大到10000x2000这样的图像大小,但Visual Studio提示无法超过屏幕大小。

由于这个图表中有很多数据,因此更大的表单提供了更多的图表数据。其他人需要通过图片来看到最大的信息量。如何实现呢?


VS是正确的; 你不能做一个比你的屏幕大的表格。这是因为用户需要看到你的表格才能访问像关闭框、工具栏、边缘等东西,所以一个比屏幕大的表格是无法使用的。如果你解释一下为什么你认为你需要这个,我们可能会提供帮助。 - Dour High Arch
这不是用户应用程序,仅限个人使用。我需要一张非常大的图形,包含最大限度的信息,如点等。 - Elperro
屏幕对我来说已经不够了。我需要将这个图表发送给分析部门,以便他们能够看到最多的信息。因此,我需要一个非常大的图表图片。 - Elperro
1个回答

4

这很简单。

你只需要在代码中创建Chart,而不将其显示在屏幕上。

现在您可以根据需要调整其大小..:

Chart bigChart = new Chart();
bigChart.ChartAreas.Add("ca");
Series s1 = bigChart.Series.Add("s1");
s1.BorderWidth = 5;
s1.ChartType = SeriesChartType.Line;

// testdata 

Random rnd = new Random(8);
for (int i = 0; i < 111; i++)
{
    s1.Points.AddXY(rnd.Next(123) + i, rnd.Next(12 * i)) ;
}

bigChart.Size = new Size(10000, 8000);

bigChart.SaveImage(filename, ChartImageFormat.Png);

一些注释:
  • 您可能还想添加一个Legend,因为动态创建的Chart没有默认元素。

  • 如果您愿意,可以使用您已经拥有的图表,将其内容序列化到文件(或流)中,然后将其加载(反序列化)到大图中。

  • 当大小增长时,MSChart的自动智能往往会达到某个限制;因此,您需要调整一些设置,如线宽、字体等。

  • 您还可以加载保存的图像,并将dpi设置为比屏幕分辨率更高的值。

  • 最后的说明:有时候将图表保存为矢量格式会更好;这些也在SaveImage方法中提供。

更新:也许您想像Jimi的最后评论那样,将矢量和像素格式结合起来。

您可能需要学习这篇文章,其中讨论了一些常见选项。


1
我正要说的是你在编辑中添加的内容:ChartImageFormat.Emf 保存了图表的可读矢量版本(AI、CorelDraw等)。它可以以任何分辨率或大小打印。 - Jimi
非常感谢,TaW。我刚刚从表单控件中删除了chart1并调整了大小 - 这起作用并保存了图例。我想增加dpi,怎么做呢?没有dpi属性? - Elperro
很抱歉,您需要在保存后加载图像,然后使用bitmap.SetResolution()再次保存。如果您使用png格式,就像您应该做的那样,质量不会受到影响。 - TaW
1
@Elperro 尝试使用以下代码:chart1.SaveImage(@"X:\chart1.emf", ChartImageFormat.Emf); using (var bmp = new Bitmap(10000, 2000)) using (var g = Graphics.FromImage(bmp)) { g.DrawImage(Image.FromFile(@"X:\chart1.emf", true), new Rectangle(Point.Empty, bmp.Size)); bmp.Save(@"X:\chart1.png", ImageFormat.Png); } - Jimi
1
@Elperro 如果需要的话,您可以使用bmp.SetResolution(300f, 300f);(300 dpi)来指定 DPI 分辨率。 - Jimi

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