我有一个构造函数,它接受一个Color
对象数组的输入和一些其他字符串(如file
的位置和list
的大小),并将此热图存储到一个名为_image_
的bitmap
实例中。一切都很好,但我的主要问题是我没有办法在这个热图上渲染文本。我想把标题文本和x轴和y轴标签叠加到这个位图上。
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;
}
}
下面,我还有一个调整图像大小的方法(没有太多失真),我想我也可以利用它,因为我有一个graphics
对象可以使用,比如:
private Bitmap ResizeBitmap(Bitmap sourceBMP, int width, int height) {
Bitmap result = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(result)) {
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
g.DrawImage(sourceBMP, 0, 0, width, height);
g.DrawString("A heatmap.", SystemFonts.DefaultFont, Brushes.Black, 10, 10);
}
return result;
}
使用上面的内容,我可以将文本覆盖在上面,作为一个起点。我的问题是,如何在上面的图像上添加一个白色边框(这样我的文本就不会与图形重叠),然后将x轴和y轴的文本叠加在上面?
我想我的具体问题是——比如说,如何在热图的每四列上呈现文本?在大多数情况下,有100个x轴对象,类似于24个y轴对象。y轴表示一天中的时间,而x轴表示一年中的日期。我对在C#中使用图形的熟悉程度很低,所以任何指针都很受欢迎。
在绘制图形之前必须使用DrawString。Dispose()和Clear()之后。
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的虚拟框,文本相对于该框居中。