23

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

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

(不需要源码解决方案,字体不会变,找个工具就行了)

编辑:理想的方法是获得一个真正的字体,其中原始字体的每个像素都转换为矢量黑色方块(我通过手动重绘几个字符进行了测试,它可以按我的意愿工作)。

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

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

4

11 回答 11

15

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

首先在 Fontforge 中集成 Autotrace,请参阅FontForge中的自动跟踪位图。这是我的做法,因为我无法使用 Win32 版本的 FontForge:

  1. 下载、解压并启动Portable Ubuntu Tres。这是一个在 Windows 下运行的特殊 linux 版本!
  2. 选择系统->管理->添加/删除应用程序,搜索FontForge并安装(管理员密码为123456)。我安装了 FontForge 版本 20090622。
  3. 从http://autotrace.sourceforge.net/index.html#download下载 autotrace-0.31.1.tar.gz并将其复制到 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. 在 Portable Ubuntu 中启动 FontForge 并打开 .FON 字体。
  2. 将字体另存为 .BDF 字体(加载 .FON 文件作为背景对我来说不起作用,所以我必须先转换字体):文件->生成字体并选择 BDF 作为格式。
  3. 创建一个新字体并将 BDF 字体导入为背景字体:文件->导入,不要忘记选择“作为背景”。
  4. 选择所有字符并在按住 shift 键的同时开始自动跟踪,以便您可以输入自动跟踪的参数。我使用了以下参数,提高了对像素轮廓的识别,但我没有找到完美的参数:

    -corner-surround=1 -line-threshold=10
    
  5. 主要使用“添加曲线点”功能手动更正字符。激活 View->Show->Almost Horizo​​ntal/Vertical Lines 使工作更容易。
  6. 生成 truetype 字体:File->Generate Fonts 并选择 truetype 作为格式。
于 2010-09-21T09:23:41.373 回答
11

我知道这个问题很老,但是值得我使用PixFont轻松地将旧的 .fon 转换为 .ttf 。我以管理员身份运行它(没有安装 - 一个旧学校可执行文件),即使原始 .fon 缺少一些正确的字形,它也生成了一个很好的 TTF。

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

于 2011-12-02T01:21:37.190 回答
6

对于那些不想编译 fontforge (for windows) 的人,请在此处下载: http ://www.mpetroff.net/software/fontforge-windows/

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

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

让字体看起来不错(通过添加和删除点)仍然需要数小时的手动工作。

于 2012-05-08T14:58:23.547 回答
5

使用FontForge,我能够生成相应的 truetype 字体,当以合适的尺寸使用时,它会给出与原始字体完全相同的字符。可能我还需要调整一些选项,因为我使用了 size=11 的原始字体。新字体仅在 size=10.5 时有效,这在 delphi 中是不可能使用的。字体在其他所有尺寸下看起来都非常糟糕。

  1. 在 FontForge 中加载 .FON 字体
  2. 选择文件->生成字体
  3. 选择“(faked) MS bitmap only sfnt (ttf)”作为类型,输入文件名并单击“保存”。

显然,它使用了一种将位图字体存储在 truetype-font 中的可能性。生成的字体没有我在使用位图字体时遇到的问题,但它在打印机上完全是空白的,因此它不能解决我的问题。

关于FontForge的说明: 我没有安装 Windows 版本的 FontForge(基于 cygwin)。而不是我安装了Portable Ubuntu Tres,这是一个适用于 Windows 的 linux 版本。它很容易安装:解压缩文件并启动 exe。然后选择 System->Administration->Add/Remove Applications 并搜索 FontForge 并安装它(管理员密码为 123456)。我安装了 FontForge 版本 20090622。

于 2010-09-20T14:38:16.840 回答
3

我发现获得一个好的 TTF 版本的 FON 最简单的方法是使用免费的在线位图字体编辑器之一。你必须手动输入每个字形,但这个过程比掌握 FontForge 简单得多。我知道有两个编辑器,它们都生成在 Windows 和 Linux 上运行良好的 TTF。

BitFontMaker是两者中较简单的一个。我喜欢它干净的界面,但我最终没有使用它,因为等宽字体的单元格宽度只能为 10 到 14 像素。

FontStruct需要注册并使用 Flash 界面。一旦习惯了界面,我就能很快地制作新字体。(这可能是巧合,但我注意到我用来注册的电子邮件帐户的垃圾邮件有所增加。)

两个编辑器都会自动设置行距。获得所需间距的一个技巧是在一个字符上添加一个高像素,然后使用矢量字体编辑器将其从 TTF 中删除。(Type light效果很好,比 FontForge 更容易使用。)

于 2015-05-13T20:43:05.033 回答
2

一种可能是使用Microsoft 的命令行工具 SBIT32使用FontForge很容易将 .FON 文件转换为 .BDF 文件。但随后您需要编写一个指标文件 (.MET)。我没有尝试,因为我想我会得到一个带有嵌入位图字体的 truetype-font,并且可以直接使用FontForge生成这样的字体(在 File 下键入“(faked) MS bitmap only sfnt (ttf)” - >生成字体)。

于 2010-09-20T14:45:10.897 回答
2

Autotrace 似乎产生了像素完美的输出,如果输入被缩放,我做了一些测试并且缩放至少 8 倍可以完美地工作。

在 FontForge 中打开位图字体后,打开 -> Element -> Bitmap Strikes,创建 8 倍分辨率的位图线条(例如:如果是 16,则为 128)。然后将此位图罢工保存为位图字体(例如bdf)。

在这个缩放的输出上执行“自动跟踪”。

点比需要的多,这可以通过使用 Element\Simplify\Simplify 来解决,这将简化轮廓。在这种仅由水平线和垂直线组成的轮廓的特定情况下,此操作应该是无损的。

它是自动化的,与手动重绘所有字符相比,使用大量字符的字体更容易。这对于绘制位图字形并具有有效位图字体文件但还不能使用它的任何人来说绝对有用(Microsoft 的 .fon 格式不支持 Unicode,并且许多应用程序无法正确使用真正的位图字体)。

于 2019-03-06T10:17:50.770 回答
1

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

"通过与 FontLab Studio 和 TypeTool 集成,位图和位图字体与 Type 1、TrueType 和 OpenType 字体之间的强大转换。 "

但是仅转换一种字体 999 美元有点贵。

于 2010-09-20T10:18:22.940 回答
1

我发现自己正在寻找这些字体以用于我正在从事的项目。想到手动编辑其他答案中提到的所有字形,我感到畏缩,我继续搜索。最终,我偶然发现了一个具有原始字体和一些较新.ttf变体的网站。如果您不在乎某些字形已被重新映射(它们仍然存在),这是一个不错的选择:Oldschool PC Fonts。作为对我的额外奖励,这些支持扩展的拉丁语、希腊语、西里尔语和希伯来语脚本以及一堆额外的字形和 Unicode 符号。

于 2016-11-06T12:16:16.487 回答
0

您不太可能使用简单的免费工具来完成它。http://www.fontlab.com有工具可以做到这一点,但它们非常昂贵。

于 2010-09-20T10:42:27.753 回答
0

我无法让自动跟踪工作,所以我编写了一个 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()
于 2017-04-26T05:21:36.403 回答