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

时间:2019-02-28 01:50:06

标签: c# image charts textbox

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

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

enter image description here

1 个答案:

答案 0 :(得分:0)

您有很多选择:

  • 您可以截屏

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

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

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

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

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

  • (推荐:),您可以使用TextAnnotationRectangleAnnotation:将其放在Chart上的适当位置,并可以使用TextBox.TextChanged事件将文本复制到TextAnnotation中。这是最“类似于图表”的选项,也是我可能要做的。

  • 您甚至可以通过可编辑的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;
}

保存所有注释时,执行会被保存,除非它们被放置在可见区域之外。.:

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

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

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

enter image description here

更新2:

现在,当您发布图表时,我可以看到您将图例停靠在底部。当然,代码需要进行一些更改,例如:

设置时,我会在右侧创建一些空间:

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;

结果:

enter image description here