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

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

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

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

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

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

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


person Name    schedule 20.09.2010    source источник
comment
вы использовали их в Windows или Linux?   -  person jokoon    schedule 05.05.2012


Ответы (11)


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

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

  1. Загрузите, распакуйте и запустите Portable Ubuntu Tres. Это специальная версия Linux, работающая под Windows!
  2. Выберите Система-> Администрирование-> Добавить / удалить приложения, найдите FontForge и установите его (пароль администратора - 123456). Я установил FontForge версии 20090622.
  3. Загрузите autotrace-0.31.1.tar.gz со страницы http://autotrace.sourceforge.net/index.html#download и скопируйте его в свой домашний каталог в Portable Ubuntu.
  4. В 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
    

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

  1. Запустите FontForge в Portable Ubuntu и откройте шрифт .FON.
  2. Сохраните свой шрифт как шрифт .BDF (загрузка файла .FON в качестве фона у меня не сработала, поэтому мне пришлось сначала преобразовать шрифт): File-> Generate Fonts и выберите BDF в качестве формата.
  3. Создайте новый шрифт и импортируйте шрифт BDF в качестве фонового шрифта: File-> Import и не забудьте выбрать «As Background».
  4. Выделите все символы и запустите автотрассировку, удерживая нажатой клавишу Shift, чтобы вы могли ввести параметры для автотрассировки. Я использовал следующие параметры, которые улучшили распознавание контура пикселей, но я не нашел идеальных параметров:

    -corner-surround=1 -line-threshold=10
    
  5. Исправьте символы вручную, используя в основном функцию «Добавить точку кривой». Активация Вид-> Показать-> Почти горизонтальные / вертикальные линии значительно упрощает работу.
  6. Создайте шрифт TrueType: File-> Generate Fonts и выберите в качестве формата TrueType.
person Name    schedule 21.09.2010
comment
Portable Ubuntu больше не существует, но можно сделать то же самое с реальной установкой Linux (в конечном итоге на виртуальной машине) - person Name; 08.11.2013
comment
autotrace не поддерживается, но вы можете установить potrace, который будет заменять его. Обязательно выберите «Prefer potrace» в диалоговом окне «Настройки FontForge», поскольку ff не обнаружит potrace самостоятельно. - person jørgensen; 10.11.2013

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

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

person Ian Patrick Hughes    schedule 02.12.2011
comment
Это действительно сработало! Установить и использовать FontForge было сложно. Этот инструмент выполнил свою работу всего за несколько кликов. - person victmo; 11.08.2014

Для тех, кто не хочет компилировать 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

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

person Mogu    schedule 08.05.2012
comment
должен любить программу, у которой есть опция под названием turdsize. хе-хе. - person Spudley; 09.05.2012
comment
Хороший момент, поскольку Portable Ubuntu Tres, кажется, исчез ... И спасибо за параметры. - person Name; 09.05.2012
comment
Между тем версия FontForge для Windows, включая potrace, доступна на официальном сайте FontForge: sourceforge.net/projects/fontforge - person Name; 08.11.2013

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

  1. Загрузите шрифт .FON в FontForge
  2. Выберите File-> Generate Fonts.
  3. В качестве типа выберите «(поддельное) MS bitmap only sfnt (ttf)», введите имя файла и нажмите «Сохранить».

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

Примечание о FontForge: мне не удалось установить Windows Версия FontForge (на основе cygwin). Вместо этого я установил Portable Ubuntu Tres, версию Linux, работающую в Windows. Установить легко: разархивируйте файл и запустите exe. Затем выберите Система-> Администрирование-> Добавить / удалить приложения, найдите FontForge и установите его (пароль администратора - 123456). У меня установлена ​​версия FontForge 20090622.

person Name    schedule 20.09.2010

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

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

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

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

person user3720403    schedule 13.05.2015

Можно использовать инструмент командной строки SBIT32 от Microsoft. Файл .FON в файл .BDF легко преобразовать с помощью FontForge. Но тогда вам нужно написать файл метрик (.MET). Я не пробовал, потому что полагаю, что получу шрифт TrueType со встроенным растровым шрифтом, и можно сгенерировать такие шрифты напрямую с помощью FontForge (введите "(поддельный) MS bitmap only sfnt (ttf)" в меню "Файл"> "Создать шрифты").

person Name    schedule 20.09.2010

Автотрассировка, кажется, дает идеальный выходной сигнал, если вход масштабируется, я провел несколько тестов, и масштабирование по крайней мере 8 × работает отлично.

После открытия растрового шрифта в FontForge, Open -> Element -> Bitmap Strikes, создайте растровое изображение с 8-кратным разрешением (например: если 16, то 128). Затем сохраните этот растровый рисунок как растровый шрифт (например, bdf).

Выполните «Autotrace» для этого масштабированного выхода.

Точек больше, чем нужно, это можно решить с помощью Element \ Simplify \ Simplify, это упростит контуры. В этом конкретном случае, когда контуры состоят только из горизонтальных и вертикальных линий, эта операция должна выполняться без потерь.

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

person Community    schedule 06.03.2019
comment
Я не знал, что можно так масштабировать растровые изображения! Это также предотвращает потерю кодировки Unicode и значительно упрощает этот ответ. - person ; 20.01.2020
comment
Кстати, вот как установить FontForge + Potrace. Загрузите FontForge здесь, Potrace здесь. Затем вам нужно добавить папку, в которой вы распаковали Potrace, в PATH переменную среды (в Windows) - person Leo Leontev; 20.01.2020
comment
Разве переменные среды не сбрасываются каждый раз при перезапуске командной строки? - person ; 21.01.2020

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

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

Но 999 долларов США - это немного дороже, чтобы преобразовать только один шрифт.

person Name    schedule 20.09.2010

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

person datatype_void    schedule 06.11.2016

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

person Strelok    schedule 20.09.2010
comment
Спасибо за ваш ответ. Fontlab - это продукт BitFonter. - person Name; 20.09.2010

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

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

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

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

-> скрипт размещен на 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()
person Zv_oDD    schedule 26.04.2017