解决方案:使用DrawtoBitmap在同一位图上分别绘制图表和文本框,并使用bitmap.save保存。
问题描述:我有分析数据并绘制图形并将它们另存为.png文件的代码。我想在.png文件中添加文本以及图形图表。是否可以将图表和文本框拼贴为单个图像,然后将其另存为单个文件? 请问到现在为止我拥有的图image.png以及我希望我的文本在同一图像中的方式。
答案 0 :(得分:0)
您有很多选择:
您可以截屏
您可以Save
Chart
的图像,DrawToBitmap
TextBox
的图像,然后在前者上绘制第二个图像。
您可以在图像上Save
Chart
的图像和DrawString
TextBox.Text
您可以将TextBox
添加到Chart.Controls
中(以代码形式!),然后使用DrawToBitmap
使图表将两者绘制成一张图像。
您可以在DrawString
事件中Chart.xxxPaint
文本并使用DrawToBitmap
接下来的两个选项使文本成为图表的真实组成部分:
(推荐:),您可以使用TextAnnotation
或RectangleAnnotation
:将其放在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
..
更新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;
结果: