Fonts 如何将位图字体(.FON)转换为truetype字体(.TTF)?
我的程序(win32,Delphi)需要在表的某些列中显示特殊字符。为此,我为这些列使用了一种特殊的字体。我从我的客户那里得到了字体。它是一种.FON字体。它在屏幕上工作得很好,但当我想用它打印东西时,我经常会遇到问题 我想将此.FON字体转换为truetype字体(.TTF),以避免出现问题。我不在乎字体是否缩放得不好。在屏幕上使用时,我应该看起来与原始字体的默认大小完全相同。 有人知道怎么做吗 (不需要源代码解决方案。字体不会改变。如果我找到一个工具就足够了) 编辑:理想的做法是获得一种truetype字体,其中原始字体的每个像素都被转换成一个矢量黑色正方形(我通过手动重画几个字符进行了测试,它可以根据我的需要工作) 编辑2,使用的解决方案:使用+然后手动进行更正,我能够得到一种矢量字体,它遵循位图字体像素的轮廓。这种矢量字体比原始字体的缩放效果要好一些,解决了我的打印问题。有关详细信息,请参阅已接受的帖子Fonts 如何将位图字体(.FON)转换为truetype字体(.TTF)?,fonts,truetype,bitmap-fonts,Fonts,Truetype,Bitmap Fonts,我的程序(win32,Delphi)需要在表的某些列中显示特殊字符。为此,我为这些列使用了一种特殊的字体。我从我的客户那里得到了字体。它是一种.FON字体。它在屏幕上工作得很好,但当我想用它打印东西时,我经常会遇到问题 我想将此.FON字体转换为truetype字体(.TTF),以避免出现问题。我不在乎字体是否缩放得不好。在屏幕上使用时,我应该看起来与原始字体的默认大小完全相同。 有人知道怎么做吗 (不需要源代码解决方案。字体不会改变。如果我找到一个工具就足够了) 编辑:理想的做法是获得一种tr
但是,如果有人知道一个全自动的解决方案,我仍然感兴趣。根据产品描述,似乎能够做到这一点: 通过与FontLab Studio和TypeTool的集成,将位图和位图字体从类型1、TrueType和OpenType字体转换为类型1、TrueType和OpenType字体
但是,仅转换一种字体就需要花费999美元。用一个简单的免费工具不太可能实现这一点。我有工具来做,但它们非常昂贵。使用我能够生成一个相应的truetype字体,当以合适的大小使用时,它提供与原始字体完全相同的字符。可能我还需要调整一些选项,因为我使用了size=11的原始字体。新字体只能在size=10.5时使用,这在delphi中是不可能使用的。这种字体在其他大小上看起来都很糟糕
我没有安装FontForge的Windows版本(基于cygwin)。而不是我安装的,它是在Windows上运行的linux版本。安装很容易:解压缩文件并启动exe。然后选择系统->管理->添加/删除应用程序,搜索FontForge并安装它(管理员密码为123456)。我安装了FontForge版本20090622。一种可能是使用命令行工具。使用将.FON文件转换为.BDF文件很容易。但是您需要编写一个度量文件(.MET)。我没有试过,因为我想我会得到一个带有嵌入式位图字体的truetype字体,并且可以直接使用文件->生成字体下的(键入“(伪造的)MS仅位图sfnt(ttf)”)生成此类字体。使用+然后手动进行一些更正 首先在Fontforge中集成Autotrace,请参阅。以下是我如何做到的,因为我无法使用win32版本的FontForge:
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
-corner-surround=1 -line-threshold=10
我知道这个问题很老了,但为了它的价值,我可以使用。我以管理员的身份运行了它(没有安装-一个老式的可执行文件),它生成了一个很好的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()