如何在 WPF 中找到任意字形的确切大小?

Posted

技术标签:

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

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

字体是使用GlyphTypeface类加载的。

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

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

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

【问题讨论】:

【参考方案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;

【讨论】:

不幸的是,这种方法不会产生正确的值 - 它可以为一个明显不是正方形的字形提供正方形大小(宽度/高度差异太大)。也许是我使用的字体有问题?

以上是关于如何在 WPF 中找到任意字形的确切大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中设置相机预览的大小

如何在MyEclipse2017修改编辑中字体的大小

在基于 Debian 的系统上,如何找到字体具有字形的 Unicode 代码点?

WPF如何制作导航控件

如何使用 AWS CLI 找到我的 AWS S3 存储桶的确切字节数?

如何翻转字形图标