我有一个包含字体文件(.ttf)内容的MemoryStream,我希望能够从该流创建一个FontFamily WPF对象,而无需将流的内容写入磁盘。我知道用System.Drawing.FontFamily可以做到这一点,但是我不知道用System.Windows.Media.FontFamily怎么做。
注意:我只有流,所以我不能在应用程序中将其打包为资源,并且由于磁盘权限问题,将无法将字体文件写入磁盘以供参考作为“内容”
更新:
API docs如何描述如何使用应用程序资源,尽管我不清楚它是程序集中嵌入资源还是磁盘上的文件。
当引用打包为应用程序一部分的字体时,可以使用基URI值。例如,基URI值可以是"pack:// application“URI,它允许您引用打包为应用程序资源的字体。下面的代码示例显示由基URI值和相对URI值组成的字体引用。
发布于 2011-09-07 23:12:08
我能想到的最好的方法是将oldFont保存到一个临时目录中,然后使用接受uri的newFont构造函数立即加载它。
发布于 2021-01-11 14:41:22
还有一个类似的问题here,它包含一个假设的解决方案,将System.Drawing.FontFamily转换为WPF字体系列,所有这些都在内存中,没有任何文件IO:
public static void Load(MemoryStream stream)
{
byte[] streamData = new byte[stream.Length];
stream.Read(streamData, 0, streamData.Length);
IntPtr data = Marshal.AllocCoTaskMem(streamData.Length); // Very important.
Marshal.Copy(streamData, 0, data, streamData.Length);
PrivateFontCollection pfc = new PrivateFontCollection();
pfc.AddMemoryFont(data, streamData.Length);
MemoryFonts.Add(pfc); // Your own collection of fonts here.
Marshal.FreeCoTaskMem(data); // Very important.
}
public static System.Windows.Media.FontFamily LoadFont(int fontId)
{
if (!Exists(fontId))
{
return null;
}
/*
NOTE:
This is basically how you convert a System.Drawing.FontFamily to System.Windows.Media.FontFamily, using PrivateFontCollection.
*/
return new System.Windows.Media.FontFamily(MemoryFonts[fontId].Families[0].Name);
}
这似乎是使用System.Drawing.PrivateFontCollection
(^)添加从MemoryStream
创建的System.Drawing.Font
,然后使用该字体的Families[0].Name
传递给System.Windows.Media.FontFamily
构造函数。我假设家族名称将是PrivateFontCollection中该字体实例的URI,但您可能必须尝试一下。
https://stackoverflow.com/questions/44394
复制相似问题