c#:如何在单个图像中保存图表和文本框(例如 *.png)?

c#: how can i save a chart and a textbox in a single image (e.g. *.png)?

解决方法:使用DrawtoBitmap在同一张位图上分别绘制图表和文本框,并使用bitmap.save保存。

问题描述:我有分析数据和绘制图形的代码,将它们保存为.png 文件。我想在 .png 文件中添加文本以及图表。是否可以将图表和文本框拼贴成单个图像,并将其保存为单个文件? 请给我到目前为止的图表 image.png,以及我希望我的文字如何出现在同一图像中。

你有很多选择:

  • 可以截图

  • 您可以 Save Chart 的图像和 DrawToBitmap TextBox 的图像,然后在前者上绘制第二张图像。

  • 您可以 Save Chart 的图像和 DrawString TextBox.Text 图像

  • 您可以将 TextBox 添加到 Chart.Controls(在代码中!),然后使用 DrawToBitmap 使图表将两者绘制成一个图像。

  • 您可以在 Chart.xxxPaint 事件中 DrawString 文本并使用 DrawToBitmap

接下来的两个选项使文本成为图表的真实部分:

  • (推荐:)您可以使用 TextAnnotationRectangleAnnotation:将它放在 Chart 上的合适位置并使用 TextBox.TextChanged 事件将文本复制到 TextAnnotation。这是最 'chart-like' 的选择,也是我最有可能做的。

  • 您甚至可以 TextBox 替换为可编辑的 TextAnnotation..!

没有看到图表,也不知道具体用途,很难推荐走哪条路..

所有 Annotations 放置起来有点棘手,但会在调整图表大小时移动,甚至会在序列化时保存到 xml。值得学习!

更新:

这是一个将文本放在 Legend 正下方的示例,假设它位于默认的右上角位置。

注意 ElementPosition 包含位置和大小,并且所有数字均以容器的百分比表示,在 Chart 的情况下。 .:

首先我们全局声明;我们也可以通过 chart.Annotions 集合访问它,但我很懒;另请注意,我使用 RectangleAnnotation,它与 TextAnnotation 相同,但具有背景颜色和边框选项..:

 RectangleAnnotation RA = null;

要创建它,我使用以下代码:

RA = new RectangleAnnotation();
RA.BackColor = Color.LightPink;
RA.Alignment = ContentAlignment.TopLeft;
chart.Annotations.Add(RA);
RaPos();

为了放置它,我使用了一个函数:

void RaPos()
{
    if (RA == null) return;
    ElementPosition LP = chart.Legends[0].Position;
    RA.X = LP.X;
    RA.Y = LP.Bottom + 5;  // 5% below the legend
    RA.Width = LP.Width;
    RA.Height = 100 - LP.Bottom  - 10;  // leave 10% of the remaining space
}

我们需要在某些点调整位置,如下所示:

private void chart_SizeChanged(object sender, EventArgs e)
{
    RaPos();
}

并与文本框同步:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    RA.Text = textBox1.Text;
}

保存所有注释时 do 会被保存,除非它们被放置在可见区域之外..:[=​​51=]

chart.SaveImage(someFileName.png, ChartImageFormat.Png);

此注释将始终停靠在图例下方,并将调整其高度以很好地填充剩余的 space..

另请注意,通过添加以下内容:RA.AllowTextEditing = true; 用户可以 双击 矩形并将 Annotation 置于编辑模式,需要单独的TextBox..

更新二:

现在,当您发布图表时,我可以看到您将 Legend 停靠在底部。当然代码需要做一些改动,可能是这样的:

设置时,我在右侧创建一些 space:

ChartArea ca = chart.ChartAreas[0];
ca.Position = new ElementPosition(5, 5, 75, 85); 

并且在定位中我直接创建了新的 ElementPosition 以适应:

// numbers are in percent!!
RA.X = 83;
RA.Y = 8;
RA.Width = 15;
RA.Height = 80;

结果: