如何使用ImageSharp获取字体的全部可用样式?含特殊样式获取方案
解决ImageSharp获取Bahnschrift特殊样式(如SemiCondensed)的问题
问题核心在于FontFamily.GetAvailableStyles()仅返回FontStyle枚举值(仅包含Normal、Bold、Italic、BoldItalic),而Bahnschrift的SemiCondensed属于**字体拉伸(FontStretch)**属性,和字重(FontWeight)共同构成字体的完整变体,需要通过以下方式获取:
步骤1:获取字体族的所有可用字体实例
使用FontFamily.GetAvailableFonts()方法,该方法返回包含完整属性(拉伸、字重、样式)的Font对象集合,而非单一的样式枚举。
步骤2:筛选目标样式
遍历集合,根据Font.Stretch、Font.Weight、Font.Style属性组合筛选,或直接通过字体全名匹配:
示例代码
// 初始化系统字体集合 var fontCollection = new FontCollection(); fontCollection.InstallSystemFonts(); // 获取Bahnschrift字体族 var bahnschriftFamily = fontCollection.Get("Bahnschrift"); // 方式1:通过拉伸属性精确筛选SemiCondensed(结合Regular字重、Normal样式) var semiCondensedFont = bahnschriftFamily.GetAvailableFonts() .FirstOrDefault(f => f.Stretch == FontStretch.SemiCondensed && f.Weight == FontWeight.Regular && f.Style == FontStyle.Normal); // 方式2:通过字体全名模糊匹配(适用于属性不明确的情况) // var semiCondensedFont = bahnschriftFamily.GetAvailableFonts() // .FirstOrDefault(f => f.FullName.Contains("SemiCondensed")); if (semiCondensedFont != null) { // 创建指定大小的字体用于绘制 var drawingFont = semiCondensedFont.CreateFont(16); // 执行文本绘制逻辑... }
关键说明
FontStretch枚举包含多种拉伸值,比如Condensed、SemiCondensed、Normal、SemiExpanded等,可直接匹配目标样式。- 部分字体的变体可能同时包含字重(如Bold)和拉伸(如SemiCondensed),只需调整筛选条件中的
Font.Weight即可获取对应变体。
内容的提问来源于stack exchange,提问作者SulfurChunk
相关产品推荐
相关产品推荐

