我需要字符位图

时间:2013-07-13 19:05:35

标签: bitmap

我已经获得了一个关于我即将开始的项目的简短信息。它有一个小的单色显示,可能有96的dpi或ppi,没有调试器,没有内部字符发生器,代码将在C中。我想打印的任何调试消息都是位图。我是一名嵌入式开发人员,但我承认我对图形或光栅成像一无所知。我将有足够的内存但处理能力有限(或者更确切地说是字符处理的时间)所以我知道我会想要使用位图字体而不是轮廓或笔划字体。

关键点:我认为必须有一些位图表(可能是二维数组),我可以使用它来从一个自制的printf中删除一些字符,但是在搜索所有内容时,我发现ascii art和函数用于openGL和这样。我只需要一些原始的位模式,希望它们周围有一些填充。我相信像画笔这样的程序有这样的表格。你能指点我一张简单的桌子吗?

2 个答案:

答案 0 :(得分:4)

为什么不点燃Paint并制作一个?最简单的方法是使用固定宽度字体(Courier)并输入ABC...

这是我刚才制作的。每个角色都是8x10。将其另存为单色位图。

character bitmap


位图标题aren't terribly complex,您可以简单地将它们从文件中删除,因为您的代码只会假设像素数据的格式。

上面的图片已转换为PNG,但我从Paint中保存的original monochrome bitmap非常容易使用。

位图的每一行是40个字节。这些行以改变顺序保存,因此第一行(y = 0)实际上是文件中的最后一行(从0x01a6开始)。字符高10像素,因此有10个40字节的行。

由于每个字符宽8个像素宽(单色位图每个像素使用1位),因此每个字符正好是1个字节。

因此,为了绘制一个字符,我们从byte( startpos )+(行号 * 40)+( char offset )开始。在适当的bmp文件中,像素数据从0x3e(62)开始。

因此,如果我们想绘制A的第一行,我们从62 +(9 * 40)+ 0 = 422或0x1a6开始。我们发现字节0x1a6是0xcf,或者是二进制,11001111。查看实际图形,我们可以看到前两个像素是白色,后两个是黑色,其余像素是白色。所以,如果一个比特为零,则绘制。 (这些位应该全部翻转,以使你的生活更轻松......)

要绘制角色的下一行,只需向后移动40个字节即可。 0x1a6 - 40 = 0x17e。在那里我们找到0xef,或11101111。

冲洗并重复:

0x1a6 11001111
0x17e 11101111
0x156 11101111
0x12e 11010111
0x106 11010111
0x0de 10111011
0x0b6 10000011
0c08e 10111011
0x066 00010001
0x03e 11111111

如果你看零,那应该看起来很像A。

您可能希望制作一个包含ASCII顺序(32-126)字符的位图,这样您就可以从每个char的值中减去32来获得字符偏移量在位图中的位置。

答案 1 :(得分:1)

有一个关于从字体到位图here的教程。或者,您可以使用其中的一些图表(例如these)来轻松创建自己的图表。另一种选择是使用these经典终端字体。