我有一个带有字体文件(.ttf)内容的MemoryStream,我希望能够从该流创建一个FontFamily WPF对象没有将流的内容写入磁盘。我知道使用System.Drawing.FontFamily可以实现这一点,但我无法找到如何使用System.Windows.Media.FontFamily进行此操作。
注意:我只会有流,所以我无法将其作为资源包装在应用程序中,并且由于磁盘权限问题,将无法将字体文件写入磁盘以供参考作为“内容”< / p>
答案 0 :(得分:1)
我能想到的最好的方法是将oldFont保存到临时目录,然后立即使用接受uri的newFont构造函数加载它。
答案 1 :(得分:1)
有一个类似的问题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
(^) 添加从 System.Drawing.Font
创建的 MemoryStream
然后使用该字体的 Families[0].Name
传递进入 System.Windows.Media.FontFamily
构造函数。我假设姓氏将是 PrivateFontCollection 中该字体实例的 URI,但您可能必须尝试一下。