如何精确测量字符的宽度

本文关键字:字符 何精确 测量 | 更新日期: 2023-09-27 18:29:34

也许我有问题,但是...我想模拟字符间距。我将单词(文本(分解为单个字符的列表,测量它们的宽度,然后在位图上一个接一个地绘制它们。我想,渲染文本的总宽度将与整个未拆分字符串的宽度相同,但有问题。在循环中呈现字符会显示更广泛的结果。有没有办法获得共同的(预期的(结果?

下面是一个代码片段:

private struct CharWidths
{
    public char Char;
    public float Width;
}
private List<CharWidths> CharacterWidths = new List<CharWidths>();

private void GetCharacterWidths(string Text, Bitmap BMP)
{
    int i;
    int l = Text.Length;
    CharacterWidths.Clear();
    Graphics g = Graphics.FromImage(BMP);
    CharWidths cw = new CharWidths();
    for (i = 0; i < l; i++)
    {
        Size textSize = TextRenderer.MeasureText(Text[i].ToString(), Font);
        cw.Char = Text[i];
        cw.Width = textSize.Width;
        CharacterWidths.Add(cw);
    }
}

public void RenderToBitmap(Bitmap BMP)
{
    //MessageBox.Show("color");
    Graphics g = Graphics.FromImage(BMP);
    GetCharacterWidths("Lyborko", BMP);
    int i;
    float X = 0;
    PointF P = new PointF(); 
    for (i = 0; i < CharacterWidths.Count; i++)
    {
        P.X = X;
        P.Y = 0;
        g.DrawString(CharacterWidths[i].Char.ToString(), Font, Brushes.White, P);
        X = X+CharacterWidths[i].Width;
    }
    P.X = 0;
    P.Y = 30;
    g.DrawString("Lyborko", Font, Brushes.White, P);
    // see the difference
}

非常感谢

如何精确测量字符的宽度

首先应该说,对此没有银弹解决方案,但对主题有几个建议:

  1. 考虑到您通过调用TextRenderer.MeasureText不传递当前device context(与您用于在之后绘制字符串的相同(并且知道一个简单的事实,即MeasureText只是在缺少该参数的情况下创建一个与桌面兼容的新参数并DrawTextEx调用 WindowsSDK 函数,我会说首先使用 MeasureText 的重载,您可以在其中指定用于呈现的第一个参数device context之后的文字。可能会有所作为。

  2. 如果失败,我会尝试使用 Control.GetPreferredSize 方法来猜测屏幕上控件的大多数预大小渲染尺寸,因此实际上是您未来字符串的位图的尺寸。为此,您可以创建一些临时控件,分配一个字符串,渲染并在调用此函数之后。我很清楚,这个解决方案可能不适合你的应用架构,但可能会产生更好的结果。

希望这有帮助。