2

任意のフォントで各文字の正確なサイズを見つける必要があります。

フォントはGlyphTypefaceクラスを使用してロードされます。

問題は、AdvanceWidthsプロパティを使用してグリフの幅にしか直接アクセスできないことですが、高さは各文字で同じであり、Heightプロパティに設定されています。

個々の文字の高さは、Baseline、Height、XHeight、BottomSideBearings、およびTopSideBearingsプロパティの組み合わせを使用して計算できるようですが、これらすべての値の実際の意味に関するドキュメントはありません。Baseline、Height、XHeightの値は、他の2つ(BottomSideBearingsとTopSideBearings)に関しては、フォント全体で一定です。それらの意味がわかりません。

一般的に、任意のフォントから個々のグリフのサイズを計算する方法についての情報はありますか?(「TTF」ファイル、またはその他のGlyphTypefaceをロードできるものだけがあります)。

4

2 に答える 2

3

いくつかの調査の後、文字サイズを計算する正しい方法を見つけました:

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 単位で得られます。実際のサイズを見つけるには、フォント サイズを掛ける必要があります。

于 2012-08-25T12:31:12.777 に答える
2

GlyphTypeface.GetGlyphOutlineメソッドによって返されるジオメトリの境界を取得できる可能性があります。

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;
于 2012-08-15T15:15:27.127 に答える