我正在尝试以编程方式在图像中心绘制日期。
到目前为止,这有效:
Font font = new Font("Arial", fontsize);
string[] datestrings = new string[] { dt.ToString("MMMM").ToUpper(), dt.Day.ToString(), dt.Year.ToString() };
for(int i = 0; i < 3; i++)
{
float textWidth = (int)datemarkGraphics.MeasureString(datestrings[i], font).Width;
textWidth += (datestrings[i].Length - 1) * spaceBetween;
float textX = (datemarkImage.Width - textWidth) / 2F;
float textY = i * (fontsize + 2F);
datemarkGraphics.DrawString(datestrings[i], font, Brushes.Black, textX, textY);
}
然而,这导致字母有点太靠近我的喜好。在我的研究中,我发现在本地执行此操作的唯一方法是单独绘制每个字母,但这会使字母间隔太远:
Font font = new Font("Arial", fontsize);
string[] datestrings = new string[] { dt.ToString("MMMM").ToUpper(), dt.Day.ToString(), dt.Year.ToString() };
for(int i = 0; i < 3; i++)
{
float textWidth = (int)datemarkGraphics.MeasureString(datestrings[i], font).Width;
textWidth += (datestrings[i].Length - 1) * spaceBetween;
float textX = (datemarkImage.Width - textWidth) / 2F;
float textY = i * (fontsize + 2F);
for (int j = 0; j < datestrings[i].Length; j++)
{
string charToDraw = datestrings[i][j].ToString();
datemarkGraphics.DrawString(charToDraw, font, Brushes.Black, textX, textY);
textX += datemarkGraphics.MeasureString(charToDraw, font).Width + spaceBetween;
}
}
注意:
除数组索引外的所有数值变量都是浮点数。
datemarkImageWidth = 228
spaceBetween = 0.3(虽然改变这似乎不会改变我所期望的规模上的sapcing,而负数仍会导致每个字母之间有额外的空间)
fontsize = 28
我在这里做错了什么?我唯一能想到的是MeasureString()函数没有像我预期的那样工作,但我不确定如何。
编辑:这不是链接的副本,它也在询问如何执行此操作,但他们没有说明他们是如何单独绘制每个字母的。