【问题标题】:How to find exact size for an arbitrary glyph in WPF?如何在 WPF 中找到任意字形的确切大小?
【发布时间】:2012-08-11 21:08:18
【问题描述】:

我需要找到任意字体中每个字符的确切大小。

字体是使用GlyphTypeface类加载的。

问题是我只能使用 AdvanceWidths 属性直接访问字形的宽度,但每个字符的高度相同,并且设置为 Height 属性。

似乎可以使用 Baseline、Height、XHeight、BottomSideBearings 和 TopSideBearings 属性的组合来计算单个字符的高度,但没有关于所有这些值的真正含义的文档。整个字体的基线、高度和 XHeight 值是恒定的,关于其他两个 - BottomSideBearings 和 TopSideBearings - 我找不到它们的含义。

一般来说,是否有任何信息可以从任意字体计算单个字形的大小? (只有“TTF”文件,或者可以从中加载任何其他 GlyphTypeface)。

【问题讨论】:

    标签: wpf fonts size height glyph


    【解决方案1】:

    经过一番研究,找到了计算字符大小的正确方法:

    var typeface = new GlyphTypeface(new Uri(fontpath));
    var character = 'W';
    var charIndex = typeface.CharacterToGlyphMap[character];
    
    var width = typeface.AdvanceWidths[charIndex];
    var height = typeface.Height - typeface.TopSideBearings[charIndex]
                                 - typeface.BottomSideBearings[charIndex];
    

    这将给出以 em 为单位的字符大小 - 要找到实际大小,需要将其乘以字体大小。

    【讨论】:

    • 你知道是否有办法在 C 中使用 vanilla Win32 GDI 调用来获得这个精确的字形高度?
    【解决方案2】:

    您也许可以获得GlyphTypeface.GetGlyphOutline 方法返回的几何图形的Bounds

    GlyphTypeface typeface = new GlyphTypeface(new Uri(@"C:\Windows\Fonts\SegoeUI.ttf"));
    ushort glyphIndex = typeface.CharacterToGlyphMap['W'];
    double emSize = 14d;
    Geometry outline = typeface.GetGlyphOutline(glyphIndex, emSize, 0d);
    Size size = outline.Bounds.Size;
    

    【讨论】:

    • 不幸的是,这种方法不会产生正确的值 - 它可以为一个明显不是正方形的字形提供正方形大小(宽度/高度差异太大)。也许是我使用的字体有问题?
    猜你喜欢
    • 2015-12-06
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2015-03-08
    • 1970-01-01
    • 2013-03-09
    相关资源
    最近更新 更多