2012-10-20 26 views
0

我以TTF格式从dafont存储库中搜集了10个像素高的位图字体。但是,我无法从中提取实际的位图数据,因为它们看起来像是矢量图形,在绘制时我无法弄清楚点的大小和像素大小之间的对应关系。我需要软件工具,库或方法的建议,以获得与字母表单相对应的准确的每像素位图数据。如何从TTF位图字体中为POV显示提取位图数据?

一个例子字体,这使得该问题的意义是http://www.dafont.com/commodore-64-pixelized.font

我的目标是使用这些位图字体的一个或多个来控制基于Arduino的持久性视觉(POV)显示作为http://shrimping.it项目的一部分。

当设备左右移动时,POV设备使用一排LED指示灯通过闪烁LED打开和关闭文字。一个众所周知的例子是Adafruit的MiniPOV http://www.ladyada.net/make/minipov3/

要编写微控制器代码来闪烁LED,我需要从字体中获取逐像素信息,换句话说,我需要一个方案从数据中提取数据我已经提供了TTF格式的文件,以避免必须手动为每个字符和每种字体进行操作。

到目前为止,我一直在尝试Processing(http://processing.org),但我看不到如何选择点大小来呈现TTF,以便字体以完全匹配到底层的像素网格。一旦我有了这个,我可以得到这些信息,但我似乎无法达到目标。 Processing处理的textAscent和textDescent值似乎是垃圾,至少是我尝试过的字体。

我正在测试的字体是Advocut,Andina,Aux DotBitC,BM管,Commodore 64 Pixelised,Homespun BRK,Nayupixel,SG05和Visitor。如果您需要查看原始数据以更好地理解问题,则可以通过在dafont.com上搜索这些文件来自行检索这些文件。

回答

0

我发现了一个解决方案,它分为三部分。

第1阶段

首先,我用Python来输出的所有可打印图形的ASCII字符,从交互式Python外壳,通过键入 '蟒蛇' 然后......

import string 
print(''.join([chr(x) for x in range(33,127)])) 

...这给以下字符序列 - 省略SPACE(32)和DEL(127)...

!"#$%&'()*+,-./:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 

阶段2

然后我启动了Inkscape,使用View> Grid激活可见像素网格,并创建一个文本元素,该文本元素包含给定字体中一行中的所有字符。我目视检查哪些字符已经回落到非像素字形。 (在没有完全指定字符的情况下,我认为它会在其中插入一个规则矢量字体,该字体可能是非整数像素,这会扰乱水平字距并错误放置剩余字符,以便它们必须被替换)。我用一个问号代替了我看到的任何非像素化字符,这个字符似乎是可靠存在的,并且在这些字体中具有整数个像素。

一旦所有的字符都是干净的像素化字符,选中文本元素(使坐标栏出现在顶部),放大视图后,我就可以将文本定位在0,0和手动选择一个像素高度,使像素元素与背景网格对齐(当我从8,9,10,11像素高切换时,确保启用了锁定符号以一起缩放水平和垂直尺寸。这些所谓的10像素字体实际上是8像素或11像素高,当他们正确排列时,这就解释了一些问题

有时精确的高度映射是一个小部分关闭,所以我通过确保水平数像素是正确的(例如有时是实际的高度是分数的,像618像素,但是7.005高。通过沿着字符进行扫描,您可以看到像素是略短还是略长,并将宽度设置为整数,直到像素符合网格。浮点高差在Inkscape中几乎不可见,并且对导出没有明显影响(小数点四舍五入),但如果水平计数错误,像素映射将被拍摄,并且由于偏移时会产生水平模糊的像素你尝试量化。

最后,仍然选中文本元素,我选择了文件>导出位图并选择了“选择”选项卡。在前一步骤中导出带有8,10,11或任意数量像素的PNG,可生成具有完美像素映射的像素图形 - 一个文件,通过该文件可以写入简单的例程来提取位图。

第3阶段

最后的程序必须写入导入PNG和提取正确的每个字符信息的POV位图。

我想出了一个可靠地检测字符水平范围的程序,并且可以将这些程序分成我的POV的单个序列。这些不是等宽字体,所以每个字符的宽度是不可预知的 - 例如,感叹号通常只有两个像素宽。需要对包含两个缺口的双引号字符进行编码。

我提取例程的源代码现在是在...

http://shrimping.it/shrimp/project/pov/font/extract_font.py

...并且可以在一组目录中的PNG文件由CDing到该目录并运行

运行
python extract_font.py 

然后这为每个字符生成单独的位图,提取到每个字体的单独目录中。

+0

感谢https://twitter.com/mgdm/status/259669824769245184和https://twitter.com/gordonjcp/status/259664637342142464他们通过Twitter提出的建议。什么也没有通过Stackoverflow :( – user336590

+0

Andina字体似乎是不可用的当前形式使用这种解决方法,因为字母之间的间距变化并且通常不是整数像素(例如,?和N字符具有部分像素间距)。 – user336590

+0

Nayupixel字体与间距有类似的问题,但它并没有那么糟糕,只需通过独立于垂直方向拉伸水平,然后使用Gimp的图像>模式>索引> 1位颜色将其平铺为位图即可恢复。 – user336590