使用.NET创建TrueType字体文件的子集

时间:2011-06-28 09:09:33

标签: .net file true-type-fonts

我正在努力实现以下目标:

  1. 创建仅定位特定字符的原始字体文件的子集
  2. 浏览Google后,我遇到了以下API:
      WPF 中{li> ComputeSubset GlyphTypeface类的方法 在CreateFontPackage
    • FontSub.dll
  3. 虽然我能够创建一个字体文件的子集,但我不确定它是否正在指定我指定的字符,因为当我打开该文件(双击文件)时,我会看到所有字符。我究竟能如何验证? 我在c:\windows\fonts安装了它,我可以输入该字体中的所有字符,而我希望它只显示我选择的字符。
  4. 是否有程序员对TrueType字体(TTF)文件的参考,这有助于我们从编程角度理解TTF文件?

2 个答案:

答案 0 :(得分:3)

如果您对学习TTF规范感兴趣,可以参考Microsoft TrueType规范v1.66。见http://www.microsoft.com/typography/SpecificationsOverview.mspx

您感兴趣的字体表是CMAP表,它指定字符代码到字形索引的映射。

但是,如果你想要做的就是验证子集化的TTF字体是否包含正确的字符,我认为引用该规范是一种过度杀伤。

我建议使用工具将字体内容转储为可读格式。有一个名为TTX的工具可以输出给定Font的字体表的XML表示。见http://www.letterror.com/code/ttx/index.html

运行TTX后,您可以运行命令“ttx.exe -tcmap MyFont.ttf”并输出文件“MyFont.ttx”。在文本编辑器中打开它,它应该显示它在字体中找到的所有字符代码

更新Ujjwal问题:

  1. 我没有使用.NET处理字体的经验;抱歉,我无法帮助您解决您的.NET问题

  2. Otaku提供的Apple链接比Microsoft规范更具可读性;请注意,苹果和微软的TTF格式规范在某些方面略有不同。

  3. 通常我会说字体的大小取决于保留字符字形的复杂程度以及是否保留提示数据。从我看过的字体来看,这些数据构成了TTF字体的大部分。 (实际嵌入式位图占用的空间更多,但根据你提到的字体大小,我敢打赌它不包含嵌入的位图)

  4. 不确定这是否有用,但如果您无法使用.NET更改字体名称,则可能会对查找名为FontForge http://fontforge.sourceforge.net/的工具感兴趣。我自己并没有真正使用它,但我相信它应该允许你更改字体名称。

答案 1 :(得分:3)

我使用了你提到的两种方法,第一种方法要容易得多。这是我使用的代码:

Imports System.Text.Encoding
Imports System.Collections
Imports System.Windows.Media
Public Class FontManager
    Sub New()
        CreateSubSet("my baloney has a first name", New Uri("C:\Windows\Fonts\impact.ttf"))
    End Sub
    Public Sub CreateSubSet(sourceText As String, fontURI As Uri)
        Dim glyphTypeface As GlyphTypeface = New GlyphTypeface(fontURI)
        Dim Index As Generic.ICollection(Of UShort)
        Index = New Generic.List(Of UShort)
        Dim sourceTextBytes As Byte() = Unicode.GetBytes(sourceText)
        Dim sourceTextChars As Char() = Unicode.GetChars(sourceTextBytes)
        Dim sourceTextCharVal As Integer
        Dim glyphIndex As Integer
        For sourceTextCharPos = 0 To UBound(sourceTextChars)
            sourceTextCharVal = AscW(sourceTextChars(sourceTextCharPos))
            glyphIndex = glyphTypeface.CharacterToGlyphMap(sourceTextCharVal)
            Index.Add(glyphIndex)
        Next
        Dim filebytes() As Byte = glyphTypeface.ComputeSubset(Index)
        Using fileStream As New System.IO.FileStream("C:\Users\Me\Documents\impact-subset.ttf", System.IO.FileMode.Create)
            fileStream.Write(filebytes, 0, filebytes.Length)
        End Using
    End Sub
End Class

当然,对于sourceText,您可以根据需要发送唯一字符。

链接gilamesh提及是学习TTF字体的好地方。我发现另一个非常宝贵的参考是http://developer.apple.com/fonts/TTRefMan/RM06/Chap6.html