我正在努力实现以下目标:
- 创建仅针对特定字符的原始字体文件的子集
- 浏览谷歌后,我发现了以下可用的API:
- WPF中
GlyphTypeface
类的ComputeSubset
方法 FontSub.dll
中的CreateFontPackage
- WPF中
- 虽然我可以创建字体文件的子集a,但我不确定它是否针对我指定的字符,因为当我打开该文件(双击文件)时,我会看到那里的所有字符。我究竟该如何验证这一点?我在
c:windowsfonts
中安装了它,我可以用这种字体键入所有字符,而我希望它只显示我选择的字符 - 是否有程序员对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问题更新:
-
我没有使用.NET处理字体的经验;对不起,我不能帮你处理你的.NET问题
-
Otaku提供的苹果链接比微软的规格更具可读性;请注意,苹果和微软的TTF格式规格在某些方面略有不同。
-
一般来说,字体的大小取决于保留的字符字形的复杂程度,以及暗示数据是否保留。从我看到的字体来看,这些数据构成了TTF字体的大部分。(实际上嵌入式位图占用了更多的空间,但根据你提到的字体大小,我敢打赌它不包含嵌入式位图)
-
不确定这是否有用,但如果你不能使用.NET更改字体的名称,你可能有兴趣查找一个名为FontForge的工具http://fontforge.sourceforge.net/.我自己并没有真正使用过它,但我相信它应该允许您更改字体名称。