转自:http://blog.csdn.net/exbob/article/details/6532772

开发环境:

Win7,Eclipse,MinGW

1、生成ASCII字符文件

ASCII编码的可打印字符是0x20~0x7E,先用运行下面这段代码,生成一个包含全部可打印字符的txt文件:

[cpp] view
plain
 copy

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc,char *argv[])
  4. {
  5. FILE * fp;
  6. unsigned char i = 0;
  7. fp = fopen("ascii.txt","w");
  8. if(fp == 0)
  9. {
  10. perror("open");
  11. return -1;
  12. }
  13. for(i=0x20;i<0x7F;i++)
  14. {
  15. fputc(i,fp);
  16. }
  17. return 0;
  18. }

运行后,用记事本打开ascii.txt文件,会看到如下文本:

2、生成字模数据

使用字模提取V2.1软件,设置字体为宋体、12,纵向取模,字节倒序(即高位在下)。这些设置可以根据实际情况设置。用C51格式生成字模,大小是8*16,每个字符用16个字节表示。如字符A的显示如下:

取模数据为:

0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,

然后将所有的字模数据复制到一个文本文件,删除其中的空行,换行,注释等与字模数据无关的内容,并将文件最后的一个逗号改为ASCII字符的句号,得到一个纯字模数据文件ascii_zk.txt

3、将字模数据文件转换为二进制文件

将ascii_zk.txt文件中的每个字模数据转换为占一个字节的数,将所有的数据填充为一个二进制文件ascii_zk.bin。这样,按照ASCII码的顺序,ascii_zk.bin中每16个字节就可以绘制一个字符。文件转换的程序如下:

[cpp] view
plain
 copy

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*
  4. *将一个ascii字符转换为数
  5. */
  6. unsigned char c2x(char ch)
  7. {
  8. unsigned char temp=0;
  9. if(ch>=0x30 && ch<=0x39)
  10. temp = ch-0x30;
  11. else if(ch>=0x41 && ch<=0x46)
  12. temp = 0x0a+(ch-0x41);
  13. else if(ch>=0x61 && ch<=0x66)
  14. temp = 0x0a+(ch-0x61);
  15. else
  16. temp =0xff;
  17. return temp;
  18. }
  19. //将ascii_zk.txt转换为二进制文件
  20. int main(void)
  21. {
  22. char buffer[5];
  23. unsigned char ch=0;
  24. int i=0;
  25. FILE *frp=0;
  26. FILE *fwp=0;
  27. for(i=0; i<5; i++)
  28. buffer[i] = 0;
  29. frp=fopen("ascii_zk.txt","r");
  30. fwp=fopen("ascii_zk.bin","w");
  31. while(buffer[4] != 0x2e) //全部数据以句号结尾
  32. {
  33. for(i=0; i<5; i++)
  34. buffer[i]=fgetc(frp);
  35. ch = c2x(buffer[2]);
  36. ch = ch*16;
  37. ch = ch+c2x(buffer[3]);
  38. fputc(ch,fwp);
  39. }
  40. fclose(frp);
  41. fclose(fwp);
  42. return 0;
  43. }

字库文件制作完毕。

4、字库文件ascii_zk.bin的使用

ascii_zk.bin文件从ASCII码的空格(0x20)开始,每16个字节表示一个字符的点阵字模。以字母A为例,它的ASCII码是0x41,那么,它的字模数据的开始位置就是:

(0x41-0x20)*16

从这个位置开始依次读取16个字节,就是字母A的字模数据,将其显示即可。

例:用Linux的终端模拟显示点阵字符,终端屏幕中的每个字符位置就是一个点,程序如下。

[cpp] view
plain
 copy

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <curses.h>
  4. #define START 0x20
  5. #define DATANUM 0x10
  6. int displaychar(FILE *fp,char dispch,char fillch,char start_x,char start_y);
  7. int main(void)
  8. {
  9. FILE* fp=0;
  10. int i = 0;
  11. const char * teststring="I love Julia";
  12. fp=fopen("ascii_zk.bin","r");
  13. initscr();
  14. for(i=0;(teststring[i]!=0);i++)
  15. {
  16. displaychar(fp,teststring[i],'*',0+(i*8),0);
  17. }
  18. refresh();
  19. while(1);
  20. endwin();
  21. fclose(fp);
  22. return 0;
  23. }
  24. /*
  25. * 以点阵方式显示一个ASCII字符
  26. * dispch是要显示的字符,fillch是填充点阵的字符
  27. * start_x,start_y是显示的起始坐标
  28. */
  29. int displaychar(FILE *fp,char dispch,char fillch,char start_x,char start_y)
  30. {
  31. int location = ((dispch-START) * DATANUM);
  32. char x=start_x;
  33. char y=start_y;
  34. int i=0;
  35. int j=0;
  36. char buf=0;
  37. //将文件流指针移到到dispch字符点阵数据的起始位置
  38. fseek(fp,location,SEEK_SET);
  39. for(i=0;i<DATANUM;i++)
  40. {
  41. buf = fgetc(fp);
  42. //显示一个字节
  43. for(j=0;j<8;j++)
  44. {
  45. move(y+j,x);
  46. if(buf & (0x01<<j))
  47. addch(fillch);
  48. }
  49. if(x == (start_x+7))
  50. {
  51. x = start_x;
  52. y = (start_y+8);
  53. }
  54. else
  55. {
  56. x++;
  57. }
  58. }
  59. return 0;
  60. }

该程序在Fedora12的终端中运行,效果如下:

下载:

ASCII点阵字库文件

ASCII字符点阵字库的制作和使用的更多相关文章

  1. GBK点阵显示字库的制作和使用

    转自:http://blog.csdn.net/exbob/article/details/6539643 GBK编码共收录汉字21003个.符号883个,并提供1894个造字码位,简.繁体字融于一库 ...

  2. 制作ASCII字符动画

    看过Matrix的同学应该还记得,在母舰上一直在计算的电脑屏幕在Neo觉醒的时候,不停的下落的杂乱无章的字符组成了Neo当时所处的场景.其实利用开源和免费的工具,我们可以将现有的视频转换为ASCII字 ...

  3. 使用opencv调用24*24点阵字库和8*16ASCII字库在图片显示文字数字

    课程实验:编程读汉字点阵字库,把自己的名字和学号叠加到图片的右下位置. 主要步骤分为三部分 第一部分:读取图片(文件读取) 第二部分:读取文字并从字库中提取相应的编码(字库的存储原理) 第三部分:将相 ...

  4. 当点阵字库遇到3D

    早在遥远的DOS时代,点阵汉字库为计算机处理汉字起到了关键作用.当时的显示器在图形模式下的分辨率只有640x480甚至320x200,显示汉字直接使用点阵字库在屏幕上打点就可以了.如今的电脑屏幕甚至手 ...

  5. ASCII字符集中的功能/控制字符

       ASCII字符集中的功能/控制字符     Function/Control Code/Character in ASCII Version: 2011-02-15 Author: gree ...

  6. 由 char()函数返回的 ASCII字符集中的功能/控制字符

    如果在excel下的单元格写入公式:=“国际经济与贸易”&CHAR(10)&"401班"&CHAR(10)&"A组".则出现: ...

  7. 将图片转为ASCII字符画

    原文:将图片转为ASCII字符画 Copyright 2012 Conmajia 源代码下载:点击这里 什么是字符画?就是用ASCII字符来近似组成图像,就像这样: ╭╮ ╭╮ ││ ││ ╭┴┴—— ...

  8. 应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) String.prototype.len=function(){return this.replace(/[^\x00-\xff]/g,"aa").length;}

    应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) String.prototype.len=function(){return this.replace(/[^\x00-\xff] ...

  9. AsciiMorph - 新奇的 ASCII 字符画生成工具&插件

    AsciiMorph 是一个新奇的 ASCII 字符画生成工具和开源插件.字符画(ASCII Art)的历史可以追溯到几十年前,起初是用在图形显示功能受限的设备上,用ASCII字符集里的可打印字符来拼 ...

随机推荐

  1. gitHub静态页面托管

    github已经是众所周知的程序员同性交友网站了,我就不多说了,(+_+)? 下面讲一讲如何在不用自己购买空间域名备案的情况下,通过github来托管自己的一些小demo或者项目 让其能够通过gith ...

  2. IT痴汉的工作现状10-Sprint Planning

    这是我们的第四个Sprint了.因为上一个迭代周期的失利,Leader群发邮件这样描写叙述道:"对任务的乐观预计,导致Sprint 3没有如期完毕. 我们须要在这次Sprint计划中细致评估 ...

  3. EasyPlayerPro(Windows)流媒体播放器开发之接口设计

    EasyPlayerPro(windows)接口说明如下: EasyPlayerPro_Open 说明:打开一个媒体流或者媒体文件进行播放,同时返回一个 player 对象指针 参数说明: fileU ...

  4. C#中的new和override(转)

    在衍生类中的方法上使用new和override关键字有何意义,可以通过一系列问题来找到答案.先看一段代码: 1 class Program 2 { 3 static void Main(string[ ...

  5. 中文WebFont探索

    本文主要讲中文webFont的相关知识,包含了业界现状.WebFont优势.实现方案等. 一 业界使用WebFont现状 1.1 英文WebFont使用现状 英文版已使用非常广泛.比较有名的字体库:G ...

  6. win7计划任务定时执行PHP脚本设置图解

    做php开发的朋友有时候会希望自己的电脑能每天定时的运行一下某个脚本,但定时执行php脚本这种概念似乎多半是在linux中才提到,下面这篇文章主要和大家分享一下在win7下如何设置计划任务,以实现定时 ...

  7. 【shell】awk引用外部变量

    在使用awk的过程中,经常会需要引用外部变量,但是awk需要使用单引号将print包起来,导致print后的$引用无效,可以采用下面的方式 例如: #!/bin/bash a="line1 ...

  8. A. Playing with Paper

    这是Codeforces Round #296 (Div. 2)的A题,题意就是: 小明有一张长为a,宽为b的纸,每当要折纸鹤时,就从纸上剪下一个正方形,然后,剩下的纸还可以剪出正方形,要是剩下的纸刚 ...

  9. Java对象 的创建与构造方法

    一.创建对象的四种方法: a. new语句: b. 利用反射,调用描述类的Class对象的newInstance()实例方法: c. 调用对象的clone(): d. 反序列化: 其中new 和 ne ...

  10. GDB打印内存命令

    用gdb查看内存 格式 x /nfu 参数说明 x是 examine 的缩写 n表示要显示的内存单元的个数 f表示显示方式, 可取如下值 x 按十六进制格式显示变量 d 按十进制格式显示变量 u 按十 ...