You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何声明GlyphRun对象?绘制数字需配置哪些属性?

问题解答

不行,只设置Characters和FontRenderingEmSize不足以创建有效的GlyphRun对象。GlyphRun依赖字体的字形核心信息(比如字形索引、宽度度量等),直接赋值字符列表无法让系统正确解析并完成渲染。

要绘制字符串“123”,你需要先获取目标字体的GlyphTypeface,将字符映射为对应的字形索引,同时指定每个字形的宽度。以下是修正后的可运行代码:

// 指定要使用的字体路径(以系统默认Segoe UI为例)
var fontPath = @"C:\Windows\Fonts\segoeui.ttf";
var glyphTypeface = new GlyphTypeface(new Uri(fontPath));

string targetText = "123";
double emSize = 20;

// 存储字形索引与宽度的列表
List<ushort> glyphIndices = new List<ushort>();
List<double> advanceWidths = new List<double>();

foreach (char c in targetText)
{
    // 把字符转换为对应字体的字形索引
    if (glyphTypeface.CharacterToGlyphMap.TryGetValue(c, out ushort glyphIndex))
    {
        glyphIndices.Add(glyphIndex);
        // 根据EmSize缩放字形宽度,保证间距正确
        double scaledWidth = glyphTypeface.AdvanceWidths[glyphIndex] * emSize;
        advanceWidths.Add(scaledWidth);
    }
}

// 创建完整的GlyphRun实例
var gr = new GlyphRun(
    glyphTypeface: glyphTypeface,
    bidiLevel: 0,
    isSideways: false,
    renderingEmSize: emSize,
    glyphIndices: glyphIndices,
    baselineOrigin: new Point(0, 0),
    advanceWidths: advanceWidths,
    glyphOffsets: null,
    characters: targetText.ToList(),
    deviceFontName: null,
    clusterMap: null,
    caretStops: null,
    language: XmlLanguage.GetLanguage("en-US")
);

// 生成可用于绘制的GlyphRunDrawing
var glyphDrawing = new GlyphRunDrawing(Brushes.Black, gr);

关键说明:

  • GlyphTypeface:必须指定具体字体文件路径,它提供了字符到字形的映射关系、字形宽度等核心度量数据。
  • glyphIndices:每个字符在对应字体中的唯一字形索引,不同字体的字形索引可能存在差异。
  • advanceWidths:每个字形的实际显示宽度,需要结合FontRenderingEmSize缩放,确保字符间的间距符合预期。

你原代码的错误在于仅赋值了Characters,缺少GlyphTypeface、glyphIndices和advanceWidths这些核心参数,导致GlyphRun无法被系统正确识别和渲染。

内容的提问来源于stack exchange,提问作者Korshunov Vladimir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:24:32