Создайте подмножество файла шрифта TrueType с помощью .NET

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

  1. Чтобы создать подмножество исходного файла шрифта, предназначенное только для определенных символов
  2. After browsing through Google I came across following APIs available:
    • ComputeSubset method of GlyphTypeface class in WPF
    • CreateFontPackage in FontSub.dll
  3. Хотя я могу создать подмножество файла шрифта, я не уверен, нацелен ли он на символы, которые я указал, потому что, когда я открываю этот файл (двойной щелчок по файлу), я вижу там все символы. Как именно я могу это подтвердить? Я установил это в c:\windows\fonts, и я могу набирать все символы этим шрифтом, тогда как я ожидал, что он будет отображать только те символы, которые я выбрал.
  4. есть ли справочник программиста по файлам шрифтов TrueType (TTF), который поможет нам понять файлы TTF с точки зрения программирования?

person Ujjwal    schedule 28.06.2011    source источник


Ответы (2)


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

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

person Todd Main    schedule 04.07.2011
comment
Спасибо @otaku и @gilamesh. Еще несколько вопросов: 1. Если я выберу шрифт с подмножеством (I/p для CreateSubSet: 1234, файл O/P: subset.ttf), я ожидаю, что символы, отличные от 1,2,3 и 4, не должны отображаться (в MS Word для напр.). Это правильное ожидание? 2. Достаточно ли использовать функцию ComputeSubset класса GlyphTypeface? или мне нужно сделать что-то дополнительное, например, удалить ненужные таблицы поиска? Доступны ли для него API? 3. Уменьшение размера файла шрифта пропорционально количеству символов, которые мы передаем как i/p? 4. Могу ли я изменить имя шрифта и семейство шрифтов? - person Ujjwal; 05.07.2011
comment
Просто чтобы было понятнее, как проверить подмножество шрифта, созданного с помощью этой функции? Я хочу убедиться, что подмножество шрифтов должно поддерживать только те символы, которые я выбрал при настройке исходного шрифта? - person Ujjwal; 05.07.2011
comment
@Ujjwal: Вот что я могу ответить на ваши вопросы. 1) дело не в том, что они не будут отображаться, а в том, что они не будут отображаться в вашем подмножестве шрифта, потому что они не существуют в этом шрифте, 2) Достаточно, я использую его постоянно, 3) Не всегда пропорционально, но определенно намного меньше, 4) Нет, не использую этот метод. Для этого вам нужно будет перейти к вызову P/Invoke — см. b2df-3a573516cc5f" rel="nofollow noreferrer">эта страница для примера. - person Todd Main; 05.07.2011
comment
Для файла шрифта .otf создается копия файла. Я что-то не так? - person Ucho; 30.11.2017
comment
Не уверен, Хьюго, я не смотрел на это много лет. - person Todd Main; 22.12.2017

Если вы заинтересованы в изучении спецификации TTF, вы можете обратиться к спецификации Microsoft TrueType версии 1.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. Предоставленная Otaku ссылка Apple более удобочитаема, чем спецификации Microsoft; просто имейте в виду, что спецификации Apple и Microsoft для формата TTF немного отличаются в некоторых аспектах.

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

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

person wschang    schedule 01.07.2011
comment
Да, fontforge — отличный инструмент. Он имеет возможность изменить имя шрифта и семейство шрифтов. На самом деле, я пытаюсь создать простой инструмент (используя C#.net), что-то похожее на fontforge с очень ограниченной функциональностью. - person Ujjwal; 05.07.2011