2010-09-20 8 views
18

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

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

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

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

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

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

+0

вы использовали те, на окнах или Linux? – jokoon

ответ

15

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

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

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

    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 и не забудьте выбрать «Как фон».
  4. Выделите все символы и запустите автотрассировку, удерживая клавишу shift, чтобы вы могли вводить параметры для автотрассы. Я использовал следующие параметры, которые улучшили признание набросков пикселей, но я не нашел идеальные параметры:

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

Portable Ubuntu больше не существует, но можно сделать то же самое с реальной установкой Linux (в конечном итоге на виртуальной машине) – Name

+2

autotrace не поддерживается, но вы можете установить potrace, который действует как замена для замены. Обязательно выберите «Предпочитайте potrace» в диалоговом окне «Настройки FontForge», так как ff не обнаружит potrace самостоятельно. –

1

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

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

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

1

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

+0

Благодарим вас за ответ. Fontlab - это продукт BitFonter. – Name

4

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

  1. Загрузите шрифт .FON в FontForge
  2. Выберите Файл-> Создать шрифты
  3. Select "(подделать) MS растровый только sfnt (TTF)" как тип, Entre имя файла и нажмите кнопку "сохранить" ,

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

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

2

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

8

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

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

+2

Это действительно сработало! Установка и использование FontForge были трудными. Этот инструмент выполнил работу всего за несколько кликов. – victmo

6

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

строящие использует Potrace вместо автотрассировка. Наилучшие параметры, которые я получил за шрифт, который я преобразующего (vgasys.fon) были:

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

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

+4

Должен любить программу, которая имеет опцию «turdsize». хе-хе. – Spudley

+0

Хорошая точка, как «Portable Ubuntu Tres», кажется, исчезла ... И спасибо за параметры. – Name

+0

Между тем версия Windows FontForge, включая potrace, доступна на официальном сайте FontForge: http://sourceforge.net/projects/fontforge/ – Name

2

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

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

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

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

+0

FontStruct - ТОЧНО, что мне нужно, спасибо! –

1

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

0

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

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

Затем в союзе Inkscape + упростите путь для очистки каждого глифа. (может выполняться в командной строке с помощью 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() 
Смежные вопросы