如何为字体生成适当的位图

本文关键字:位图 字体 | 更新日期: 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传递给方法,看看结果是否发生了变化。