Создайте подмножество файла шрифта TrueType, используя .NET - PullRequest
3 голосов
/ 28 июня 2011

Я пытаюсь добиться следующих вещей:

  1. Для создания подмножества исходного файла шрифтов, предназначенного только для определенных символов
  2. После просмотра в Google я наткнулся на следующие доступные API:
    • ComputeSubset метод GlyphTypeface класса в WPF
    • CreateFontPackage в FontSub.dll
  3. Хотя я могу создать подмножество a файла шрифта, я не уверен, нацелено ли оно на символы, которые я указал, потому что когда я открываю этот файл (двойной щелчок по файлу), я вижу все символы там. Как именно я могу это подтвердить? Я установил это в c:\windows\fonts, и я могу печатать все символы в этом шрифте, тогда как я ожидал, что он покажет только те символы, которые я выбрал.
  4. есть ли справочник программиста по файлам шрифтов TrueType (TTF), который помогает нам понять файлы TTF с точки зрения программирования?

Ответы [ 2 ]

3 голосов
/ 04 июля 2011

Я использовал оба упомянутых вами метода, первый намного проще.Вот код, который я использую:

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 вы можете просто отправлять уникальные символы, если хотите.TTF шрифты.Другая ссылка, которую я нашел неоценимой, - http://developer.apple.com/fonts/TTRefMan/RM06/Chap6.html

3 голосов
/ 02 июля 2011

Если вы заинтересованы в изучении спецификации 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 для обработки шрифтов; извините, я не могу помочь вам с вашими вопросами .NETs

  2. Ссылка Apple, предоставленная Otaku, более читаема, чем спецификации Microsoft; просто учтите, что спецификации Apple и Microsoft для формата TTF немного отличаются в некоторых аспектах.

  3. Как правило, я бы сказал, что размер шрифта зависит от того, насколько сложными являются сохраненные глифы символов, а также от того, сохранились ли данные хинтинга или нет. Из шрифтов, которые я видел, эти данные составляют основную часть шрифта TTF. (На самом деле встроенные растровые изображения занимают больше места, но, исходя из размера упомянутого вами шрифта, держу пари, он не содержит встроенных растровых изображений)

  4. Не уверен, что это будет полезно, но если вы не можете изменить имя шрифта с помощью .NET, вас может заинтересовать поиск инструмента под названием FontForge http://fontforge.sourceforge.net/. Я сам на самом деле не использовал его но я считаю, что это должно позволить вам изменить имя шрифта.

...