我正在努力实现以下目标:
ComputeSubset
GlyphTypeface
类的方法
在CreateFontPackage
中FontSub.dll
c:\windows\fonts
安装了它,我可以输入该字体中的所有字符,而我希望它只显示我选择的字符。答案 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问题:
我没有使用.NET处理字体的经验;抱歉,我无法帮助您解决您的.NET问题
Otaku提供的Apple链接比Microsoft规范更具可读性;请注意,苹果和微软的TTF格式规范在某些方面略有不同。
通常我会说字体的大小取决于保留字符字形的复杂程度以及是否保留提示数据。从我看过的字体来看,这些数据构成了TTF字体的大部分。 (实际嵌入式位图占用的空间更多,但根据你提到的字体大小,我敢打赌它不包含嵌入的位图)
不确定这是否有用,但如果您无法使用.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