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



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

  1. 创建仅针对特定字符的原始字体文件的子集
  2. 浏览谷歌后,我发现了以下可用的API:
    • WPF中GlyphTypeface类的ComputeSubset方法
    • FontSub.dll中的CreateFontPackage
  3. 虽然我可以创建字体文件的子集a,但我不确定它是否针对我指定的字符,因为当我打开该文件(双击文件)时,我会看到那里的所有字符。我究竟该如何验证这一点?我在c:windowsfonts中安装了它,我可以用这种字体键入所有字符,而我希望它只显示我选择的字符
  4. 是否有程序员对TrueType字体(TTF)文件的参考,可以帮助我们从编程的角度理解TTF文件

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

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:WindowsFontsimpact.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:UsersMeDocumentsimpact-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

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

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

然而,我认为,如果您只想验证子集TTF字体是否包含正确的字符,那么引用规范就太过分了。

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

一旦你运行了TTX,你可以运行命令"TTX.exe-tcmap MyFont.ttf",它应该输出一个文件"MyFont.TTX"。在文本编辑器中打开它,它应该显示它在字体中找到的所有字符代码

Ujjwal问题更新:

  1. 我没有使用.NET处理字体的经验;对不起,我不能帮你处理你的.NET问题

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

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

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

相关内容

  • 没有找到相关文章

最新更新