Fonts 如何将位图字体(.FON)转换为truetype字体(.TTF)?

Fonts 如何将位图字体(.FON)转换为truetype字体(.TTF)?,fonts,truetype,bitmap-fonts,Fonts,Truetype,Bitmap Fonts,我的程序(win32,Delphi)需要在表的某些列中显示特殊字符。为此,我为这些列使用了一种特殊的字体。我从我的客户那里得到了字体。它是一种.FON字体。它在屏幕上工作得很好,但当我想用它打印东西时,我经常会遇到问题 我想将此.FON字体转换为truetype字体(.TTF),以避免出现问题。我不在乎字体是否缩放得不好。在屏幕上使用时,我应该看起来与原始字体的默认大小完全相同。 有人知道怎么做吗 (不需要源代码解决方案。字体不会改变。如果我找到一个工具就足够了) 编辑:理想的做法是获得一种tr

我的程序(win32,Delphi)需要在表的某些列中显示特殊字符。为此,我为这些列使用了一种特殊的字体。我从我的客户那里得到了字体。它是一种.FON字体。它在屏幕上工作得很好,但当我想用它打印东西时,我经常会遇到问题

我想将此.FON字体转换为truetype字体(.TTF),以避免出现问题。我不在乎字体是否缩放得不好。在屏幕上使用时,我应该看起来与原始字体的默认大小完全相同。 有人知道怎么做吗

(不需要源代码解决方案。字体不会改变。如果我找到一个工具就足够了)

编辑:理想的做法是获得一种truetype字体,其中原始字体的每个像素都被转换成一个矢量黑色正方形(我通过手动重画几个字符进行了测试,它可以根据我的需要工作)

编辑2,使用的解决方案:使用+然后手动进行更正,我能够得到一种矢量字体,它遵循位图字体像素的轮廓。这种矢量字体比原始字体的缩放效果要好一些,解决了我的打印问题。有关详细信息,请参阅已接受的帖子


但是,如果有人知道一个全自动的解决方案,我仍然感兴趣。

根据产品描述,似乎能够做到这一点:

通过与FontLab Studio和TypeTool的集成,将位图和位图字体从类型1、TrueType和OpenType字体转换为类型1、TrueType和OpenType字体


但是,仅转换一种字体就需要花费999美元。

用一个简单的免费工具不太可能实现这一点。我有工具来做,但它们非常昂贵。

使用我能够生成一个相应的truetype字体,当以合适的大小使用时,它提供与原始字体完全相同的字符。可能我还需要调整一些选项,因为我使用了size=11的原始字体。新字体只能在size=10.5时使用,这在delphi中是不可能使用的。这种字体在其他大小上看起来都很糟糕

  • 在FontForge中加载.FON字体
  • 选择文件->生成字体
  • 选择“(伪造)MS位图仅sfnt(ttf)”作为类型,输入文件名并单击“保存”
  • 显然,它可以将位图字体存储在truetype字体中。生成的字体没有位图字体的问题,但打印机上完全空白,因此无法解决我的问题

    关于以下内容的说明:
    我没有安装FontForge的Windows版本(基于cygwin)。而不是我安装的,它是在Windows上运行的linux版本。安装很容易:解压缩文件并启动exe。然后选择系统->管理->添加/删除应用程序,搜索FontForge并安装它(管理员密码为123456)。我安装了FontForge版本20090622。

    一种可能是使用命令行工具。使用将.FON文件转换为.BDF文件很容易。但是您需要编写一个度量文件(.MET)。我没有试过,因为我想我会得到一个带有嵌入式位图字体的truetype字体,并且可以直接使用文件->生成字体下的(键入“(伪造的)MS仅位图sfnt(ttf)”)生成此类字体。

    使用+然后手动进行一些更正

    首先在Fontforge中集成Autotrace,请参阅。以下是我如何做到的,因为我无法使用win32版本的FontForge:

  • 下载、解压缩并开始。这是一个在Windows下工作的特殊linux版本
  • 选择系统->管理->添加/删除应用程序,搜索FontForge并安装它(管理员密码为123456)。我安装了FontForge版本20090622
  • 从下载autotrace-0.31.1.tar.gz,并将其复制到便携式Ubuntu的主目录中
  • 在便携式Ubuntu中,选择应用程序->附件->终端以编译和安装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
    
  • 然后转换您的字体:

  • 在便携式Ubuntu中启动FontForge并打开.FON字体
  • 将字体另存为.BDF字体(加载.FON文件作为背景对我不起作用,因此我必须先转换字体):文件->生成字体并选择BDF作为格式
  • 创建新字体并将BDF字体导入为背景字体:文件->导入,不要忘记选择“作为背景”
  • 选择所有字符并在按住shift键的同时启动自动跟踪,以便您可以输入自动跟踪的参数。我使用了以下参数,这提高了对像素轮廓的识别,但我没有找到完美的参数:

    -corner-surround=1 -line-threshold=10
    
  • 主要使用“添加曲线点”功能手动更正字符。 激活视图->显示->几乎水平/垂直的线条使工作更容易
  • 生成truetype字体:文件->生成字体并选择truetype作为格式

  • 我知道这个问题很老了,但为了它的价值,我可以使用。我以管理员的身份运行了它(没有安装-一个老式的可执行文件),它生成了一个很好的TTF,尽管原来的.fon缺少一些正确的标志符号


    而且,虽然它不是免费的,但29美元几乎是免费的,尤其是与非常昂贵的商业产品相比

    对于那些不想编译fontforge(windows版)的用户,请在此处下载:

    该构建使用了potrace而不是autotrace。我转换的字体(vgasys.fon)的最佳参数是:

    --turdsize 0--optorerance 0--unit 1--longcrove--gamma 0--blacklevel 0--cleartext


    要使字体看起来好看(通过添加和删除点),仍然需要数小时的手工工作。

    我发现,要获得一个好的TTF版本的FON,最简单的方法是使用一个免费的在线位图字体编辑器
    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()