我有这个构造函数,它接受Color
个对象和一些misc字符串(如file
位置和大小list
)的输入,并将此热图存储到名为bitmap
的{{1}}实例。一切都很好,但我的主要问题是我没有办法将文字渲染到这个热图上。我想将标题文本和x和y轴标签叠加到此位图上。
_image_
下面,我还有一个调整图像大小的方法(没有太多的失真),我想我也可以使用它,因为我有一个 public HeatMap(IEnumerable<Color> colors, int width, int height, string file, int U, int V) {
if (colors == null)
throw new ArgumentNullException("colors");
if (width <= 0)
throw new ArgumentException("width must be at least 1");
if (height <= 0)
throw new ArgumentException("height must be at least 1");
_width = width;
_height = height;
_file = file;
_image = new Bitmap(U, V, PixelFormat.Format32bppArgb);
Graphics graphics = Graphics.FromImage(_image);
graphics.Clear(Color.White);
graphics.Dispose();
int x = 0;
int y = 0;
foreach (Color color in colors) {
_image.SetPixel(x, y, color); // This can be speeded up by using GH_MemoryBitmap if you want.
y++;
if (y >= V) {
y = 0;
x++;
}
if (x >= U)
break;
}
}
对象我可以使用,如下所示:< / p>
graphics
使用上面的内容,我能够在其上叠加文字作为起点。我的问题是,如何在上面的图像上添加一个白色边框(所以我的文字不会与我的图形重叠),然后将x和y轴文本叠加到它上面?
我想我的具体问题是 - 如何将文字渲染到热像图的每四列?在大多数情况下,有100个x轴对象,就像24个y轴对象一样。 y轴将具有一天的时间,而x轴具有一年中的某一天。我对在C#中使用图形的熟悉程度非常低,所以任何指针都非常受欢迎。
答案 0 :(得分:0)
你必须在graphics.Dispose()之前和Clear()之后使用DrawString。
Graphics graphics = Graphics.FromImage(_image);
graphics.Clear(Color.WhiteSmoke);
graphics.DrawString("your text", SystemFonts.DefaultFont, Brushes.Black, new PointF(0, 0));
graphics.Dispose();
如果PointF(0,0)表示文本占位符的左上角,则需要根据热图的位置计算文本位置。
更新(对齐)
您可以将文本与虚拟矩形对齐,执行以下操作:
Graphics graphics = Graphics.FromImage(_image);
graphics.Clear(Color.WhiteSmoke);
StringFormat stringFormat = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
graphics.DrawString("your text", SystemFonts.DefaultFont, Brushes.Black, new RectangleF(0, 0, 100, 100), stringFormat);
graphics.Dispose();
在这种情况下,我在左上角创建了一个100x100的虚拟框,文本的h / v相对于此框居中。