嵌入式HZK16字库显示
来源:互联网 发布:java爬虫教学视频 编辑:程序博客网 时间:2024/05/07 04:57
Linux下gcc编译:
#include <stdio.h> #include <string.h> #include <errno.h>void read_hzk16(const unsigned char *s, char* chs) { const char* path = "hzk16"; FILE *fp = fopen(path,"r"); if (!fp) { printf("failed to fopen %s: %s\n", path, strerror(errno)); return; } int size = 32; unsigned long offset=((s[0]-0xa1)*94+(s[1]-0xa1))*size; //找出汉字在HZK16中的偏移位置 fseek(fp,offset,SEEK_SET); //文件指针偏移到要找的汉字处 fread(chs,1,size,fp); //读取该汉字的字模 fclose(fp); } void display_hzk16(const char* chs) { int size = 32; // 一个汉字所占字节数 int i = 0; int j = 0; for (i = 0; i < size; i++)//显示 { if (i % 2 == 0) { printf("\n"); //每行两字节,16X16点阵 } for (j = 7; j >= 0; j--) { if (chs[i]&(0x1<<j)) { printf("X"); //由高到低,为1则输出'X',反之输出'-'; } else { printf("_"); } } } printf("\n"); } void read_asc16(const unsigned char *s, char* asc) { const char* path = "asc16"; FILE *fp = fopen(path,"r"); if (!fp) { printf("failed to fopen %s: %s\n", path, strerror(errno)); return; } unsigned long offset=s[0]*16; fseek(fp,offset,SEEK_SET); fread(asc,16,1,fp); fclose(fp); } void display_asc16(const char* asc) { int i = 0; int j = 0; for (i = 0; i < 16; i++)//显示 { printf("\n"); //每行一字节,8X16点阵 for (j = 7; j >= 0; j--) { if (asc[i]&(0x1<<j)) { printf("X"); //由高到低,为1则输出'X',反之输出'-'; } else { printf("_"); } } } printf("\n"); } int main(int argc, char** argv){ unsigned char s[]="我们的asgs"; //要显示的汉字 char tmp[32]; const unsigned char* p = s; int len = strlen(s); while(len > 0) { if (*p > 0x80) // 区号大于0x80的为汉字 { memset(tmp, 0, sizeof(tmp)); read_hzk16(p,tmp); //去字库中读取汉字字模 display_hzk16(tmp); //在屏幕上显示这个汉字 p += 2; len -= 2; } else { memset(tmp, 0, sizeof(tmp)); read_asc16(p,tmp); //去字库中读取字模 display_asc16(tmp); p++; len--; } } return 0;}
升级版本,支持放大、包边
</pre><pre name="code" class="cpp">#include <stdio.h> #include <string.h> #include <errno.h>#include <assert.h>#define BLACK 'X'#define WHITE '-'#define EDGE 'o'// gb2312 简体 16x16void read_hzk16(const unsigned char *s, char* chs) { int ret = -1; const char* path = "gb2312.dzk"; FILE *fp = fopen(path,"r"); if (!fp) { printf("failed to fopen %s: %s\n", path, strerror(errno)); return; } int size = 32; unsigned long offset=((s[0]-0xa1)*94+(s[1]-0xa1))*size; //找出汉字在HZK16中的偏移位置 ret = fseek(fp,offset,SEEK_SET); //文件指针偏移到要找的汉字处 assert(ret == 0); ret = fread(chs,1,size,fp); //读取该汉字的字模 assert(ret == size); fclose(fp); }// gb2312 繁体(简转繁) 16x16void read_fanti_hzk16(const unsigned char *s, char* chs) { int ret = -1; const char* path = "gb2312_fanti.dzk"; FILE *fp = fopen(path,"r"); if (!fp) { printf("failed to fopen %s: %s\n", path, strerror(errno)); return; } int size = 32; unsigned long offset=((s[0]-0xa1)*94+(s[1]-0xa1))*size; //找出汉字在HZK16中的偏移位置 ret = fseek(fp,offset,SEEK_SET); //文件指针偏移到要找的汉字处 assert(ret == 0); ret = fread(chs,1,size,fp); //读取该汉字的字模 assert(ret == size); fclose(fp); }// gbk 字库 16x16 兼容gb2312简体 扩展了繁体void read_gbk16(const unsigned char *s, char* chs) { int ret = -1; const char* path = "gbk.dzk"; FILE *fp = fopen(path,"r"); if (!fp) { printf("failed to fopen %s: %s\n", path, strerror(errno)); return; } int size = 32; int qh = s[0] - 0x81; int wh = (s[1] < 0x7f) ? (s[1] - 0x40) : (s[1] - 0x41); unsigned long offset=(qh*190+wh)*size; //找出汉字在字库中的偏移位置 ret = fseek(fp,offset,SEEK_SET); //文件指针偏移到要找的汉字处 assert(ret == 0); ret = fread(chs,1,size,fp); //读取该汉字的字模 assert(ret == size); fclose(fp); } // ascii 16x8void read_asc16(const unsigned char *s, char* asc) { int ret = -1; const char* path = "asc16.dzk"; FILE *fp = fopen(path,"r"); if (!fp) { printf("failed to fopen %s: %s\n", path, strerror(errno)); return; } int size = 16; unsigned long offset=s[0]*size; ret = fseek(fp,offset,SEEK_SET); assert(ret == 0); ret = fread(asc,1,size,fp); assert(ret == size); fclose(fp); } void show(const char* p, int row, int col){ int i = 0; for (i = 0; i < row*col; i++) { if (i%col == 0) { printf("\n"); } printf("%c", p[i]); } printf("\n\n");}void bit2char(const char* chs, int size, char* font) { int i = 0; int j = 0; int idx = 0; for (i = 0; i < size; i++) { for (j = 7; j >= 0; j--) { if (chs[i]&(0x1<<j)) { font[idx++] = BLACK; } else { font[idx++] = WHITE; } } } } // 四周再包一个像素void add_edge(const char* src, int row, int col, char* dst) { row += 2; col += 2; memset(dst, WHITE, row*col); int i = 0; int j = 0; int k = 0; for (i = 1; i < row-1; i++) { for (j = 1; j < col-1; j++) { int idx = i*col+j; dst[idx] = src[k++]; } } for (i = 1; i < row-1; i++) { for (j = 1; j < col-1; j++) { int idx = i*col+j; if (dst[idx] == BLACK) { int top_idx = idx - col; int bottom_idx = idx + col; int left_idx = idx - 1; int right_idx = idx + 1; //printf("ij[%d %d] idx: %d, top_idx: %d, bottom_idx: %d, left_idx: %d, right_idx: %d\n", i ,j, idx, top_idx, bottom_idx, left_idx, right_idx); dst[top_idx] = (dst[top_idx] == BLACK) ? BLACK : EDGE; dst[bottom_idx] = (dst[bottom_idx] == BLACK) ? BLACK : EDGE; dst[left_idx] = (dst[left_idx] == BLACK) ? BLACK : EDGE; dst[right_idx] = (dst[right_idx] == BLACK) ? BLACK : EDGE; //printf("dst[top_idx] %c, dst[bottom_idx] %c, dst[left_idx] %c, dst[right_idx] %c\n", dst[top_idx], dst[bottom_idx], dst[left_idx], dst[right_idx]); } } }} // 字体等比放大2倍,size放大了4倍(一个字节变为4个字节)void zoom2times(const char* font16x16, int row, int col, char* font32x32) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { char c = font16x16[i*col+j]; int x = i*2; int y = j*2; int dst_col = col*2; int idx = x*dst_col+y; font32x32[idx] = c; //top font32x32[idx+1] = c; // right font32x32[idx+dst_col] = c; // bottom font32x32[idx+dst_col+1] = c; // right and bottom } } } int main(int argc, char** argv){ unsigned char s[]="漢汉a"; //要显示的汉字 char tmp[32]; const unsigned char* p = s; int len = strlen(s); while(len > 0) { if (*p > 0x80) // 区号大于0x80的为汉字 { printf("chinese 0x%02x 0x%02x\n", *p, *(p+1)); memset(tmp, 0, sizeof(tmp)); //read_hzk16(p,tmp); //去字库中读取汉字字模 //read_fanti_hzk16(p,tmp); read_gbk16(p,tmp); char font16x16[16*16]; bit2char(tmp, 32, font16x16); show(font16x16, 16, 16); char font18x18[18*18]; add_edge(font16x16, 16, 16, font18x18); show(font18x18, 18, 18); char font32x32[32*32]; zoom2times(font16x16, 16, 16, font32x32); show(font32x32, 32, 32); char font34x34[34*34]; add_edge(font32x32, 32, 32, font34x34); show(font34x34, 34, 34); p += 2; len -= 2; } else { printf("ascii 0x%02x\n", *p); memset(tmp, 0, sizeof(tmp)); read_asc16(p,tmp); //去字库中读取字模 char font16x8[16*8]; bit2char(tmp, 16, font16x8); show(font16x8, 16, 8); char font18x10[18*10]; add_edge(font16x8, 16, 8, font18x10); show(font18x10, 18, 10); char font32x16[32*16]; zoom2times(font16x8, 16, 8, font32x16); show(font32x16, 32, 16); p++; len--; } } return 0;}
字库文件下载:http://download.csdn.net/detail/codeheng/9545664
0 0
- 嵌入式HZK16字库显示
- HZK16点阵字库程序
- 中文字符点阵信息的显示和插入新字符(基于HZK16 ASC16软字库)
- 使用HZK16字库文件提取文字并显示到OLED显示屏上(Java Android实现)
- 16*16点阵字库HZK16的使用
- UCDOS中的点阵字库HZK12,HZK16,HZK24,ASC12,ASC16(转)
- 使用UCDOS的HZK16点阵字库的演示程序
- iconv实现编码转换与中文点阵字库HZK16
- 点阵字库HZK12 HZK16 HZK24 ASC12 ASC16 简介 及 使用方法
- 基于HZK16的汉字显示技术
- 基于HZK16的汉子显示技术
- 基于HZK16的汉字显示技术
- Linux 下GB2312简体中文编码表(字库文件为hzk16,未上传)_1
- HZK16汉字16*16点阵字库的使用及示例程序
- 点阵字库HZK12 HZK16 HZK24 ASC12 ASC16 简介 及 使用方法[附源码]
- 点阵字库HZK12 HZK16 HZK24 ASC12 ASC16 简介 及 使用方法[附源码]
- HZK16汉字16*16点阵字库的使用及示例程序
- 点阵字库显示系列之二:GB2312点阵字库显示
- Java 读取Excel文件
- 《unix高级环境编程》线程控制——线程属性
- 第十一周项目一 函数版星号图2
- HDU - 4991(树状数组优化 dp)
- 图片实现无缝滚动
- 嵌入式HZK16字库显示
- 多年后你爱的不过是回忆里的那个人
- UVA 10130 SuperSale
- 如何删除Windows服务
- Qt text Browser 控件使用
- vi简单实用手册
- Linux服务器的配置
- 第十二周 项目一(2)
- 企业IT管理员IE11升级指南【5】—— 不跟踪(DNT)例外