首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET PrivateFontCollection -加载不同样式的字体

.NET PrivateFontCollection -加载不同样式的字体
EN

Stack Overflow用户
提问于 2011-02-03 00:04:10
回答 2查看 4.1K关注 0票数 3

我正在尝试将一个应用程序从传统的ASP.NET移植到Azure,但我遇到了一个字体问题。有一个组件可以用一种特殊的非标准字体(让我们称其为"Water")来呈现图像。

水作为几个不同的TTF文件存在,每个文件代表不同的样式。我总共有12个不同的TTF文件,涵盖了“水黑斜体”,“水光”,“水规则”,“水超轻”等风格。

在ASP.NET上,只需在Windows目录中安装字体,然后从代码中调用:

代码语言:javascript
复制
Font _fontMedium = new Font("Water Medium", iFontMedium, FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);

然而,在Azure上,你不能安装你自己的字体。因此,为了能够在图像上绘制这些字体,我需要使用应用程序将字体文件作为内容上传,并使用PrivateFontCollection类单独加载它们。

我当前的代码是:

代码语言:javascript
复制
        PrivateFontCollection fontcollection = new PrivateFontCollection();
        string fontpath = string.Concat(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "assets\\");
        fontcollection.AddFontFile(string.Concat(fontpath,"water-bold-webfont.ttf"));
        fontcollection.AddFontFile(string.Concat(fontpath, "water-ultralight-webfont.ttf"));
        fontcollection.AddFontFile(string.Concat(fontpath, "water-medium-webfont.ttf"));
        FontFamily[] privatefontfamilies = fontcollection.Families;


        Font _fontMedium = new Font("Water Medium", iFontMedium, FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
        Font _fontSmall = new Font("Water UltraLight", iFontSmall, System.Drawing.GraphicsUnit.Pixel);
        Font _fontMini = new Font("Water Bold", iFontMini, System.Drawing.GraphicsUnit.Pixel);

我遇到的问题是,在添加字体文件后断开后,fontcollection.Families集合中只有一个系列:“水”。

类似地,在声明字体对象之后,Family默认为Microsoft Sans-Serif。如果我改用:

代码语言:javascript
复制
Font _fontMedium = new Font("Water", iFontMedium, FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);

该字体加载了"Water“系列,但似乎不能给我正确选择样式的能力。我唯一的字体样式选项是在FontStyle枚举中定义的那些字体样式,它们没有涵盖我试图加载的所有字体样式。

简而言之,给定一个特定的字体及其所有可用样式加载到单独的TTF文件中,如何将它们加载到PrivateFontCollection中并单独使用它们?

EN

回答 2

Stack Overflow用户

发布于 2011-10-07 20:51:28

参考上面的代码,您可以尝试...

代码语言:javascript
复制
Font _fontMedium = 
    new Font(privatefontfamilies[0] , iFontMedium, FontStyle.Regular, 
             System.Drawing.GraphicsUnit.Pixel);

而不是使用fontname字符串参数化字体。

微软表示(来源:MSDN):

传递给字体构造函数的第一个参数是字体系列名称(而不是字体构造函数的其他变体所使用的FontFamily对象)

我挣扎着认为这绝对是错误的(而且不起作用)!使用fontfamily的名称,您想要创建的字体将被替换为类似的字体(就像您上面写的那样)。使用fontfamily-object作为参数很好(对我来说)。

票数 1
EN

Stack Overflow用户

发布于 2011-02-07 19:48:00

我对此有一个答案。我挣扎了一段时间,试图让PrivateFontCollection正常工作,但GDI一点也不愿意。

我开始深入研究像AddFontResource这样的原生Win32函数,看看它们是否能做些什么。我最终发现,您所需要做的就是将TTF字体文件打包为包中的内容,为每种字体添加注册表项到"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts中以注册它,然后您就可以使用为注册表项指定的名称创建一个新字体。

简而言之:

代码语言:javascript
复制
AddFont("Water (TrueType)", string.Concat(fontpath, "Water-Black.ttf"));

Font myfont = new Font("Water Black",16f);

private void AddFont(string fontname, string path) {
    Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", fontname, path, RegistryValueKind.String);
}

这在dev上似乎工作得很好,我会去测试一下并返回报告。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4876745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档