fontcollection.loadfonts 无法加载 .ttf 文件,主因是路径错误、流未重置位置或资源名不匹配;需确保 stream 可读且 position=0,嵌入资源用 getmanifestresourcenames 验证全名,加载后调用 getfont 测试解析,并在 textgraphicsoptions 中显式注入 fontdescription。
FontCollection.LoadFonts 无法加载 .ttf 文件?检查路径和流释放
直接用 FontCollection.LoadFonts("font.ttf") 报错“file not found”或空字体列表,大概率是路径没解析对,或者文件被其他进程占用。ImageSharp 本身不负责字体加载,SixLabors.Fonts 才是核心——它要求传入的 Stream 必须可读、未关闭、且位置在开头。
常见错误:用 File.OpenRead() 后没重置位置;或用 Assembly.GetExecutingAssembly().GetManifestResourceStream() 加载嵌入资源时路径写错(注意命名空间前缀)。
- 本地文件推荐用
new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.Asynchronous),确保可异步读取且不被锁死 - 嵌入资源务必确认完整资源名,可用
Assembly.GetExecutingAssembly().GetManifestResourceNames()调试输出验证 - 加载后建议立刻调用
fontCollection.GetFont("FontName", 400, FontStyle.Regular)测试是否真能解析出字体族,避免“静默失败”
ImageSharp 绘制文字时提示 “No fonts registered”
这说明 FontCollection 实例没传给 TextGraphicsOptions,或传了但没生效。ImageSharp 2.x+ 不再全局注册字体,必须显式绑定到绘图上下文。
关键点在于:不是把 FontCollection 存起来就行,而是在每次创建 TextGraphicsOptions 时通过 FontCollection 构造参数注入:
var options = new TextGraphicsOptions(true)
{
Font = fontCollection.CreateFont("Noto Sans CJK SC", 16),
// 注意:这里 Font 是 FontDescription 类型,不是 FontFamily 或 string
};
如果字体名含空格或中英文混排(如 “Microsoft YaHei”),务必用实际 PostScript 名(可用 FontForge 或 font.FamilyName 输出确认),别依赖显示名。