如何为字体生成适当的位图
本文关键字:位图 字体 | 更新日期: 2023-09-27 17:49:34
我有一个关于位图字体的问题。我需要为屏幕设备创建字体。它应该包含所有可打印字符的位图。为了获得所有字符的位图,我使用以下方法:
public MFont(Font font, int first = 32, int last = 126)
{
var characters = new List<Character>();
Bitmap objBmpImage = new Bitmap(1, 1);
// Create a graphics object to measure the text's width and height.
Graphics objGraphics = Graphics.FromImage(objBmpImage);
for (int i = first; i <= last; i++)
{
char c = Convert.ToChar(i);
int intWidth;
int intHeight;
string s = "" + c;
// This is where the bitmap size is determined.
intWidth = (int)objGraphics.MeasureString(s, font).Width;
intHeight = (int)objGraphics.MeasureString(s, font).Height;
// Create the bmpImage again with the correct size for the text and font.
objBmpImage = new Bitmap(objBmpImage, new Size(intWidth, intHeight));
objGraphics = Graphics.FromImage(objBmpImage);
// Set Background color
objGraphics.Clear(Color.White);
objGraphics.SmoothingMode = SmoothingMode.None;
objGraphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;
objGraphics.DrawString(s, font, new SolidBrush(Color.Black), 0, 0);
objGraphics.Flush();
characters.Add(
new Character
{
Bitmap = objBmpImage,
Code = i,
Size = objBmpImage.Size
}
);
}
}
问题是所有字符位图的左右两侧都有太多的空间。因此,当我在屏幕上使用这些位图显示文本时,文本就像在每个字符之后添加了一个空格。我该怎么修理呢?也许有一些我不知道的字体,或者他们应该如何显示。我知道我可以手动裁剪位图,但这不是很准确和清晰。此外,有些字符根本没有多余的空格
两边多余的空间是填充。你必须在标志上指定NoPadding。阅读以下链接:
http://msdn.microsoft.com/en-us/magazine/cc751527.aspx另外,要注意字符串的测量可能会考虑斜体文本所需的空间——因此您可能在每个字符的右侧有额外的间距。
你说有些字符没有多余的空格。这意味着你看到的额外间距可能是由于字距,或缺乏字距。
你必须实现你自己的"字距"来压缩字符(比例字体)。否则,你总是看起来不是最优的。
有一些方法可以伪造字距,但它需要你对你的位图做一些后期处理。
尝试使用TextRenderer.MeasureText()
代替Graphics.MeasureString()
。它允许您指定将在测量期间使用的TextFormatFlags
。我怀疑默认情况下添加了填充,所以尝试将TextFormatFlags.NoPadding
传递给方法,看看结果是否发生了变化。