我有一个C#程序,它是一个控制台应用程序,但是使用了System.Windows.Forms.DataVisualization.Charting
中的Chart对象,而没有将Chart
附加到Form
上
基本上,我需要在Chart
控件上生成一个甜甜圈图,在甜甜圈中心内打印一些文本,然后将图形和文本保存到磁盘上的文件中。
如果我在TextAnnotation
事件中创建了PrePaint
,然后使用DrawToBitmap
将图表保存到磁盘,即使我使用了覆盖文本,也不会在磁盘上的文件中显示Chart.Flush
和Chart.Update
的各种组合,等等。据我所知,事件正在触发,TextAnnotation
代码正在运行。
另一方面,如果我根本不使用事件,则从Graphics
获取一个Chart.CreateGraphics
对象,然后从Graphics.DrawString
获取文本,然后从{{1} }和Graphics.Flush
,仍不会显示该文本。
我猜测这是因为Chart.DrawToBitmap
不知道用Chart.DrawToBitmap
绘制的多余内容,即使我以为Chart.CreateGraphics
会解决这个问题。
保存图形和文本的最佳方法是什么?
编辑:根据要求添加了代码:
Graphics.Flush
答案 0 :(得分:2)
我怀疑图表在您的标签上方绘制。当您调用DrawToBitmap时,图表将仅考虑其知道的视觉效果,而不考虑之后绘制的元素。
您需要颠倒绘图顺序。即
代码:
using (Bitmap bmp = new Bitmap(chart.Width, chart.Height))
{
chart.DrawToBitmap(bmp, chart.Bounds); // draw chart into bitmap first!
using (Graphics g = Graphics.FromImage(bmp)) // <--- new
{
// now draw label
String str = series.Tag.ToString();
Font font = new Font("Microsoft Sans Serif", 32, FontStyle.Bold);
SizeF strSize = g.MeasureString(str, font);
int strX = 100; int strY = 100;
g.DrawString(str, font, new SolidBrush(Color.Black), strX, strY);
g.DrawRectangle(new Pen(Color.Black), new Rectangle(strX, strY, (int)strSize.Width, (int)strSize.Height));
g.Flush();
}
bmp.Save(chartPath);
}
编辑:请确保遵循以下评论中的Jimi's建议:
”引用
System.Drawing.Imaging
,以使PixelFormat
和ImageFormat
可用。目前,图像以.bmp扩展名保存,而它是.png文件。 (默认)“