Как преобразовать растровый шрифт (.FON) в шрифт TrueType (.TTF)? - PullRequest
18 голосов
/ 20 сентября 2010

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

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

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

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

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

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

Ответы [ 11 ]

0 голосов
/ 26 апреля 2017

Мне не удалось заставить работать автотрассировку, поэтому я написал скрипт на 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()
...