http://bbs.csdn.net/topics/90113612
点阵字库就是将一个字分成m x n个小方块,每个小方块相当于一个像素,每个像素用1 bit记录点的颜色,字体颜色或背景颜色。比如1表示字体颜色0表示背景颜色。
据我猜测,你写出的点阵字库是16X16的。即每个字有16X16个像素。一般16X16点阵字库是横向扫瞄
两个字节记录一行的16个像素。比如:0x03 0x0f写成二进制是:
0000001100001111,象素值为0在相应位置显示背景色,1显示字体颜色。
http://blog.csdn.net/u012519969/article/details/17298011
下面的二维数组定义了10个数字的字模(要是采用别的字体,这个数组中的数字变一下即可):
- char a[10][8]=
- {
- {0x00,0x18,0x24,0x24,0x24,0x24,0x24,0x18}, //0
- {0x00,0x18,0x1c,0x18,0x18,0x18,0x18,0x18}, //1
- {0x00,0x1e,0x30,0x30,0x1c,0x06,0x06,0x3e}, //2
- {0x00,0x1e,0x30,0x30,0x1c,0x30,0x30,0x1e}, //3
- {0x00,0x30,0x38,0x34,0x32,0x3e,0x30,0x30}, //4
- {0x00,0x1e,0x02,0x1e,0x30,0x30,0x30,0x1e}, //5
- {0x00,0x1c,0x06,0x1e,0x36,0x36,0x36,0x1c}, //6
- {0x00,0x3f,0x30,0x18,0x18,0x0c,0x0c,0x0c}, //7
- {0x00,0x1c,0x36,0x36,0x1c,0x36,0x36,0x1c}, //8
- {0x00,0x1c,0x36,0x36,0x36,0x3c,0x30,0x1c}, //9
- };
以数字3对应的数据a[3]({0x00,0x1e,0x30,0x30,0x1c,0x30,0x30,0x1e}, //3)为例,包括有8个十六进制的数,每行一个十六进制数,并且换成二进制的表示,会是什么样的呢?
是这样的:
00000000 //0x00
00011110 //0x1e
00110000 //0x30
00110000 //0x30
00011100 //0x1c
00110000 //0x30
00110000 //0x30
00011110 //0x1e
请看1出现的地方,可以借着鼠标按1出现的轨迹跟着划一划,不就是
数字3字型的轮廓
吗?只不过,耳朵状的3是反着的(这自有道理,看完程序1自会明白)。
- #include<iostream>
- using std::cout;
- using std::endl;
- using std::cin;
- char a[10][8]=
- {
- {0x00,0x18,0x24,0x24,0x24,0x24,0x24,0x18}, //0
- {0x00,0x18,0x1c,0x18,0x18,0x18,0x18,0x18}, //1
- {0x00,0x1e,0x30,0x30,0x1c,0x06,0x06,0x3e}, //2
- {0x00,0x1e,0x30,0x30,0x1c,0x30,0x30,0x1e}, //3
- {0x00,0x30,0x38,0x34,0x32,0x3e,0x30,0x30}, //4
- {0x00,0x1e,0x02,0x1e,0x30,0x30,0x30,0x1e}, //5
- {0x00,0x1c,0x06,0x1e,0x36,0x36,0x36,0x1c}, //6
- {0x00,0x3f,0x30,0x18,0x18,0x0c,0x0c,0x0c}, //7
- {0x00,0x1c,0x36,0x36,0x1c,0x36,0x36,0x1c}, //8
- {0x00,0x1c,0x36,0x36,0x36,0x3c,0x30,0x1c}, //9
- };
- int main()
- {
- int b[8];
- int c[10];
- int x;
- int n;
- int num=0;
- cout<<"输入要显示的数字:";
- cin>>n;
- while(n!=0)
- //选择whie与for循环的关键一点是:结束循环的条件的确定
- //如果用for循环如何确定这个结束条件呢?
- //这么写
- // for(k=0; n&&k<8; k++) //c数组将分离出n中的各位数,不过是倒着的,例n=123,c中保存3 2 1
- // {
- // c[k]=n%10;
- // n/=10;
- // }
- {
- c[num]=n%10;
- n=n/10;
- num++;
- }
- for(int i=0;i<8;i++)
- // for循环的次序能够影响输出的格式,
- // i与q的调换就是 横着与竖着输出,这里犯错误了,
- // 基本弄明白了。需要再熟练理解。
- {
- for(int q=num-1;q>=0;q--)
- {
- x=a[c[q]][i];
- for(int j=0;j<8;j++)
- {
- b[j]=x%2;
- x=x/2;
- if(b[j]%2)cout<<"p";
- else cout<<" ";
- }
- }
- cout<<endl;
- }
- return 0;
- }