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