【问题标题】:C# WPF How to load a FontFamily from a byte array?C# WPF 如何从字节数组加载 FontFamily?
【发布时间】:2017-12-08 07:27:36
【问题描述】:

嗯,我基本上想将我将在我的 WPF 应用程序中使用的字体集合嵌入。它们存储在我自己的虚拟文件系统(如 WinRAR)中,我只想通过字节数组或内存流加载它们。但是,我还没有找到任何可行的解决方案。我尝试过 PrivateFontCollection,但最后,我意识到 Families 属性适用于 WinForms(System.Drawing.FontFamily 和 NOT System.Windows.Media.FontFamily)。我还将它们分类到操作系统级别是不可能的。

所以问题仍然存在:

如何使用字节数组或内存流加载 System.Windows.Media.FontFamily?

编辑:

这是一个 .ttf 文件(True Type 字体)

【问题讨论】:

  • 你看到Packaging Fonts with Applications的文章了吗?
  • 是的,但问题是我想将我的字体存储在我自己的文件系统中,而不是将它们存储在应用程序级别(或操作系统级别)中。
  • 我正在尝试在我自己的应用程序中实现这一点(托管在 Azure 上的 WebAPI,因此无法在系统上安装字体(我可以找到)),但我被卡住了:在这种情况下,MemoryFonts 是什么,LoadFont 中的 FontFamily() 是如何知道要查看系统字体而不是系统字体的,因为您传递的只是名称?
  • 实际上,这对我来说仍然是一件奇怪的事情......虽然,出于某种原因,它有效......我只是不知道如何。我将字体系列的名称传递给字体系列构造函数,它可以识别字体,而无需在操作系统级别安装字体。对于“MemoryFonts”的事情......这是一个变量。请注意我如何向它添加字体 Dictionary,int 是键,它是我的资源系统上的字体 id,值基本上是 ACTUAL 字体的“加载器”,当然是从函数“加载”加载字体”。
  • 添加您的解决方案作为答案,这样这个问题就不会被视为未回答。

标签: c# arrays wpf fonts stream


【解决方案1】:

您已发布此解决方案:

如果有人正在寻找这种解决方案,它就在这里:

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);
}

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 2017-10-31
    • 2014-03-19
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多