Как преобразовать растровый шрифт (.FON) в шрифт truetype (.TTF)?

Моя программа (win32, Delphi) должна отображать специальные символы в некоторых столбцах таблицы. Для этого я использую специальный шрифт для этих столбцов. Я получил шрифт от своего клиента. Это шрифт .FON. Он работает хорошо на экране, но я часто получаю проблемы, как только я хочу использовать его для печати. ​​

Я хотел бы преобразовать этот шрифт .FON в шрифт truetype (.TTF), чтобы избежать проблем. Мне все равно, если шрифт не масштабируется. Я должен просто выглядеть точно так же, когда он используется на экране с тем же размером, что и размер шрифта по умолчанию для исходного шрифта. Кто-нибудь знает способ сделать это?

(Нет необходимости в исходном коде. Шрифт не изменится. Этого достаточно, если я найду инструмент для этого)

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

Изменить 2, используемое решение: Использование FontForge + Autotrace, а затем вручную внести поправки, я смог получить векторный шрифт, который следует за контуром пикселей шрифта растрового изображения. Этот векторный шрифт масштабируется несколько лучше оригинального шрифта и решает проблемы с печатью. См. Принятое сообщение для деталей.

Но мне все еще интересно, если кто-то знает полностью автоматизированное решение.

Ответ 1

Использовать FontForge + Autotrace затем сделайте некоторые исправления вручную.

Сначала интегрируйте Autotrace в Fontforge, см. Автотрассировка растровых изображений в FontForge. Вот как я это сделал, так как я не смог использовать версию FontForge win32:

  • Загрузите, распакуйте и запустите Portable Ubuntu Tres. Это специальная версия Linux, которая работает под Windows!
  • Выберите System- > Administration- > Add/Remove Applications, найдите FontForge и установите его (пароль администратора - 123456). У меня установлена ​​FontForge версия 20090622.
  • Загрузите autotrace-0.31.1.tar.gz из http://autotrace.sourceforge.net/index.html#download и скопируйте его в свой домашний каталог в Portable Ubuntu.
  • В Portable Ubuntu выберите Applications- > Accessories- > Terminal для компиляции и установки autotrace:

    sudo bash  (password is 123456)
    gunzip autotrace-0.31.1.tar.gz
    tar xf autotrace-0.31.1.tar
    cd autotrace-0.31.1
    ./configure
    make
    make install
    

Затем преобразуйте шрифт:

  • Запустите FontForge в Portable Ubuntu и откройте шрифт .FON.
  • Сохраните шрифт в качестве шрифта .BDF(загрузка файла .FON в качестве фона не работала для меня, поэтому мне пришлось сначала преобразовать шрифт): File- > Generate Fonts и выбрать BDF в качестве формата.
  • Создайте новый шрифт и импортируйте шрифт BDF в качестве фонового шрифта: File- > Import и не забудьте выбрать "Как фон".
  • Выберите все символы и запустите автотрассировку, удерживая клавишу shift, чтобы вы могли вводить параметры для автотрассы. Я использовал следующие параметры, которые улучшили распознавание контура пикселей, но я не нашел идеальных параметров:

    -corner-surround=1 -line-threshold=10
    
  • Исправить символы вручную, используя в основном функцию "Добавить точку кривой". Активация View- > Show- > Почти горизонтальные/вертикальные линии облегчают работу.
  • Создайте шрифт TrueType: File- > Generate Fonts и выберите TrueType как формат.

Ответ 2

Я знаю, что этот вопрос старый, но для чего мне стоило легко преобразовать старый .fon в .ttf, используя PixFont, Я запускал его как администратор (без инсталляций - исполняемый файл старой школы на месте), и он генерировал хороший TTF, хотя в исходном .fon отсутствовали некоторые правильные глифы.

И, хотя он не является бесплатным, он равен 29 долларам, особенно по сравнению с очень дорогими коммерческими продуктами.

Ответ 3

Для тех, кто не хочет компилировать fontforge (для Windows), загрузите здесь: http://www.mpetroff.net/software/fontforge-windows/

В этой сборке используется potrace вместо autotrace. Лучшие параметры, которые я получил для шрифта, который я конвертировал (vgasys.fon), были:

--turdsize 0 --opttolerance 0 --unit 1 --longcurve --gamma 0 --blacklevel 0 --cleartext

Было все еще часами ручной работы, чтобы шрифт выглядел хорошо (путем добавления и удаления точек).

Ответ 4

Использование FontForge Мне удалось создать соответствующий шрифт TrueType, который дает точно такие же символы, что и исходный шрифт, когда используется хороший размер. Может быть, мне все еще нужно настроить некоторые параметры, потому что я использовал свой оригинальный шрифт размером size = 11. Новый шрифт работает только с размером = 10,5, что невозможно использовать в delphi. Шрифт выглядит ужасно при любых других размерах.

  • Загрузите шрифт .FON в FontForge
  • Выберите File- > Generate Fonts
  • Выберите "(поддельный) растровый файл MS только sfnt (ttf)" как тип, введите имя файла и нажмите "сохранить".

По-видимому, он использует возможность хранения растровых шрифтов в шрифте truetype. Полученный шрифт не имеет проблем с моими растровыми шрифтами, но он полностью пуст на принтере, так что он не решает мою проблему.

Заметка о FontForge: Мне не удалось установить версию Windows FontForge (на основе cygwin). Вместо этого я установил Portable Ubuntu Tres, которая представляет собой версию Linux, которая работает в Windows. Он прост в установке: распакуйте файл и запустите exe. Затем выберите System- > Administration- > Add/Remove Applications и найдите FontForge и установите его (пароль администратора - 123456). У меня установлена ​​FontForge версия 20090622.

Ответ 5

Возможно, возможно использовать инструмент командной строки SBIT32 fom Microsoft. Легко преобразовать файл .FON в файл .BDF, используя FontForge. Но тогда вам нужно написать файл показателей (.MET). Я не пробовал, потому что я предполагаю, что я получу шрифт truetype со встроенным шрифтом растровых изображений, и можно создавать такие шрифты непосредственно с помощью FontForge (введите "(поддельный) растровый файл MS только sfnt (ttf)" в разделе "Файл- > Генерировать шрифты" ).

Ответ 6

Я обнаружил, что самый простой путь к получению хорошей TTF-версии FON - использовать один из бесплатных онлайн-редакторов шрифтов растровых изображений. Вам нужно вручную вводить каждый глиф, но процесс намного проще, чем приступать к FontForge. Есть два редактора, о которых я знаю, и оба они создают TTF, которые отлично работают в Windows и Linux.

BitFontMaker является более простым из двух. Мне нравится его чистый интерфейс, но я не использовал его, потому что моноширинные шрифты могут иметь ширину ячейки от 10 до 14 пикселей.

FontStruct требует регистрации и использует интерфейс Flash. Я смог быстро создавать новые шрифты, как только я привык к интерфейсу. (Возможно, это совпадение, но я заметил всплеск спама на учетной записи электронной почты, которую я использовал для регистрации.)

Оба редактора автоматически устанавливают межстрочный интервал. Трюк, чтобы получить промежуток, который вы хотите, состоит в том, чтобы добавить высокий пиксель на один символ, а затем использовать редактор векторных шрифтов, чтобы удалить его из TTF. (Тип свет работает хорошо и намного проще в использовании, чем FontForge.)

Ответ 7

В соответствии с описанием продукта BitFonter 3.0, похоже, может это сделать:

"Мощное преобразование растровых изображений и растровых шрифтов из шрифтов Type 1, TrueType и OpenType через интеграцию с FontLab Studio и TypeTool".

Но 999 долларов США немного дороже конвертировать только один шрифт.

Ответ 8

Вряд ли вы можете сделать это с помощью простого бесплатного инструмента. http://www.fontlab.com есть инструменты для этого, но они очень дороги.

Ответ 9

Я нашел, что искал эти шрифты для использования с проектом, над которым я работаю. Опираясь на мысль о ручном редактировании всех глифов, как упоминалось в других ответах, я продолжал искать. В конце концов я наткнулся на сайт с оригинальным шрифтом, а также с некоторыми новыми вариантами .ttf. Если вам все равно, что некоторые из глифов были переназначены (они все еще присутствуют), это хорошая альтернатива: Шрифты Oldschool PC, В качестве дополнительного бонуса для меня эта поддержка расширила латинские, греческие, кириллические и ивритские скрипты плюс кучу дополнительных символов и символов Unicode.

Ответ 10

Я не мог заставить autotrace работать, поэтому я написал A python script для отслеживания черно-белых изображений в векторные многоугольники, по одному для каждого пикселя.

Итак, с папкой с изображениями глифов, вы можете преобразовать ее в папку с файлами svg.

Затем в Inkscape union + упростите путь для очистки каждого глифа. (может выполняться в командной строке с помощью Inkscape)

Наконец импортируйте соответствующий svg в FontForge для каждого символа.

- > script размещен на gist.gisthub.com

from PIL import Image
import svgwrite
import os
import argparse


def bmp_to_svg(filename, multiply =1):

    img = Image.open(filename)
    w, h = img.size
    pixel_acc = img.load()

    generated_paths = paths_gen(pixel_acc, w,h, multiply=multiply)

    dwg = svgwrite.Drawing(profile='tiny')
    for path in generated_paths:
        options = path
        kwoptions = {} #{"fill":"black"}
        dwg.add(dwg.polygon(options, **kwoptions))

    #clip_path = dwg.defs.add(dwg.clipPath())
    #clip_path.add(dwg.Rect(insert=(0,0), size=((w*multiply)+1, (h*multiply)+1)))
    return dwg

def paths_gen(pixel_acc, w, h, multiply = 1):
    m = multiply
    paths = []
    for y in range(0,h):
        for x in range(0,w):
            pix = pixel_acc[x,y]
            brightval = sum(pix) /3
            if brightval < 128:
                paths.append([
                        ##top left
                        (x * m, y * m),
                        ##top right
                        ((x+1) * m, y * m),
                        ##bottom right
                        ((x+1) * m, (y+1) * m),
                        ##bottom list
                        ((x) * m, (y+1) * m),
                        ##close back to top left
                        #(x, y), 
                    ])
    return paths


def main():
    parser = argparse.ArgumentParser(
        description='Script to convert black and white images into vector art')
    parser.add_argument("input_dir")
    parser.add_argument("ouput_dir")
    parser.add_argument("in_ext", default="bmp", help="file extension of images in input folder")
    parser.add_argument("-m", "--multiply", default=1, type=int)
    ## TODO
    #parser.add_argument("-u", "--union", store=True, help="unifies adjecent polgons")
    #parser.add_argument("-s", "--simplify", store=True, help="removes points that are part of a straight line")
    #parser.add_argument("-c", "--compress", store=True, help="same as '--union --simplify'")

    args = parser.parse_args()


    cdir = os.path.abspath(args.input_dir)

    fn_gen = ( x for x in os.listdir(cdir)
                 if x.endswith('.'+args.in_ext)
             )

    for count, filename in enumerate(fn_gen):

        full_filename =  os.path.join(cdir, filename)

        new_fn = "{}_.svg".format(filename)
        new_fullfn =  os.path.join(args.ouput_dir, new_fn)


        svg = bmp_to_svg(full_filename, multiply=args.multiply)
        print "Converted file: '{}'".format(full_filename)
        svg.filename = new_fullfn
        svg.save()

if __name__ == '__main__':
    main()