搜索
bottom↓
回复: 43

谁能说说字模提取软件的算法原理,一直在用别人的,就是不知道原理

[复制链接]

出0入0汤圆

发表于 2009-9-22 14:10:05 | 显示全部楼层 |阅读模式
搬张板凳,洗耳恭听。谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2009-9-22 16:33:08 | 显示全部楼层
根据区位码找到汉字在字库中的字模起始位置,将所要的字模取出来再重新整合,有纵向横向及字符大小不同,主要是字模的整合生成所要的字模

出0入0汤圆

发表于 2009-9-22 18:17:40 | 显示全部楼层
这个字库从哪里弄来呢?那如果要选择不同的字体该什么办呢?

出0入0汤圆

发表于 2009-9-22 20:55:19 | 显示全部楼层
[转载]字模生成原理

本设计中因为使用汉字的点阵显示,需要提取汉字字模,因此我们首先来了解汉字点阵字模的提取方法。

 汉字的点阵字模是从点阵字库文件中提取出来的。例如常用的16×16点阵HZK16文件,12×12点阵HZK12文件等等,这些文件包括了GB 2312字符集中的所有汉字。现在只要弄清汉字点阵在字库文件中的格式,就可以按照自己的意愿去显示汉字了。
  下面以HZK16文件为例,分析取得汉字点阵字模的方法。
   HZK16文件是按照GB 2312-80标准,也就是通常所说的国标码或区位码的标准排列的。国标码分为 94 个区(Section),每个区 94 个位(Position),所以也称为区位码。其中01~09 区为符号、数字区,16~87 区为汉字区。而 10~15 区、88~94 区是空白区域。
  如何取得汉字的区位码呢?在计算机处理汉字和ASCII字符时,使每个ASCII字符占用1个字节,而一个汉字占用两个字节,其值称为汉字的内码。其中第一个字节的值为区号加上32(20H),第二个字节的值为位号加上32(20H)。为了与ASCII字符区别开,表示汉字的两个字节的最高位都是1,也就是两个字节的值都又加上了128(80H)。这样,通过汉字的内码,就可以计算出汉字的区位码。
  具体算式如下:
  qh=c1-32-128=c1-160 wh=c2-32-128=c2-160
  或   
  qh=c1-0xa0 wh=c2-0xa0
  qh,wh为汉字的区号和位号,c1,c2为汉字的第一字节和第二字节。
  根据区号和位号可以得到汉字字模在文件中的位置:
  location=(94*(qh-1)+(wh-1))*一个点阵字模的字节数。
  那么一个点阵字模究竟占用多少字节数呢?我们来分析一下汉字字模的具体排列方式。
  例如下图中显示的“汉”字,使用16×16点阵。字模中每一点使用一个二进制位(Bit)表示,如果是1,则说明此处有点,若是0,则说明没有。这样,一个16×16点阵的汉字总共需要16*16/8=32个字节表示。字模的表示顺序为:先从左到右,再从上到下,也就是先画左上方的8个点,再是右上方的8个点,然后是第二行左边8个点,右边8个点,依此类推,画满16×16个点。

对于其它点阵字库文件,则也是使用类似的方法进行显示。例如HZK12,但是HZK12文件的格式有些特别,如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。因为字库设计者为了使用的方便,字模每行的位数均补齐为8的整数倍,于是实际该字库的位长度是16*12,每个字模大小为24字节,虽然每行都多出了4位,但这4位都是0(不显示),并不影响显示效果。 还有UCDOS下的HZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体)这些打印字库文件,每个字模占用24*24/8=72字节,不过这类大字模汉字库为了打印的方便,将字模都放倒了,所以在显示时要注意把横纵方向颠倒过来就可以了。
  这样我们就完全清楚了如何得到汉字的点阵字模,这样就可以在程序中随意的显示汉字了。

5.7.2  字模提取程序

如果在程序中使用的汉字数目不多,也可以不必总是在程序里带上几百K的字库文件,也许你的程序才只有几十K。这样可以事先将所需要显示的汉字字模提取出来,放在另一个文件里,按照自己的顺序读取文件就可以了。
  下面的程序说明了具体显示汉字的方法,以16×16汉字为例,使用HZK16文件。

#include<stdio.h>
#include<graphics.h>

/* x,y为显示坐标,s为显示字符串,colour为颜色 */
void hanzi16(int x,int y,char *s,int colour)
{
FILE *fp;
char buffer[32]; /* 32字节的字模缓冲区 */
register i,j,k;
unsigned char qh,wh;
unsigned long location;
if((fp=fopen("hzk16","rb"))==NULL)
{
printf("Can't open hzk16!");
getch();
exit(0);
}
while(*s)
{
qh=*s-0xa0;
wh=*(s+1)-0xa0;
location=(94*(qh-1)+(wh-1))*32L; /* 计算汉字字模在文件中的位置 */
fseek(fp,location,SEEK_SET);
fread(buffer,1,32,fp);
for(i=0;i<16;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
putpixel(x+8*j+k,y+i,colour);
s+=2;
x+=16; /* 汉字间距 */
}
fclose(fp);
}

main()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");

hanzi16(246,200,"****************************!",BROWN);

getch();
closegraph();
}

在TC 2.0下运行上面程序,就在屏幕上打印出你想要显示的汉字,例如该程序运行后会在屏幕上显示:**************************!

程序中每次将一个汉字的点阵字模存储于buffer[32]缓冲数组里面,因此我们可以编程从该缓冲数据组里面取出对应汉字的点阵模存储于另的一个数组里面,然后可以通过PC机串口发送给单片机,最后显示在LED点阵显示屏上。在制作过程中我是用了别人已经写好了的点阵字模提取软件来提取点阵字模。

出0入0汤圆

发表于 2009-9-22 22:48:05 | 显示全部楼层
不用理会那么多了,创建个画布,把汉字写在上面,再读出点阵信息就行了。
这个方法可以使用WINDOWS使用的所以字体

出0入0汤圆

发表于 2009-9-22 23:13:45 | 显示全部楼层
mark.

出0入0汤圆

发表于 2009-9-22 23:32:03 | 显示全部楼层
jh

出0入0汤圆

发表于 2009-9-23 08:15:07 | 显示全部楼层
解释的不错,呵呵

出0入0汤圆

 楼主| 发表于 2009-9-23 08:22:30 | 显示全部楼层
谢谢啊。
那个PCtoLCD软件不错,可以支持中英文输入的取模。它的原理应该和【4楼】 Anymcu 说的一样吧?就是对上位机不熟悉,不知道对图形如何取点阵的方法唉...
网上取点阵字模的软件很多,看来大家都掌握了原理,都是上位机高手啊

出0入0汤圆

发表于 2009-9-24 20:28:10 | 显示全部楼层
各位帮个忙,我现在已经用VB实现了根据区位码找到汉字在字库中的字模起始位置这一步,我不知道该如何将所要的字模取出来?各位大侠帮帮我吧。我急需要。谢谢了!

出0入0汤圆

发表于 2009-9-26 17:26:45 | 显示全部楼层
记得10多年前,在国内做毕业设计的时候,就是做的和显示汉字相关的项目,要求是不用ucdos等软件,直接在电脑显示器上显示汉字。其原理和现在单片机的字模原理是一模一样的。如果需要更多的字库,可以去找找以前的ucdos,里面有很多各种字体的字库,其使用原理是一样的,当然ucdos里面还有很多矢量字库,所以不要搞错了。

出0入0汤圆

发表于 2009-10-31 07:05:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-17 14:47:43 | 显示全部楼层
学习了

出0入0汤圆

发表于 2009-12-31 21:27:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-31 21:46:49 | 显示全部楼层
就是直接把字用GDI输出到画布上,然后把画布上的显示点阵存成个小BMP,干啥还搞得那么复杂还区码位码的,那是20年前的路子了

出0入0汤圆

发表于 2010-4-29 09:13:40 | 显示全部楼层
mark,研究中

出0入50汤圆

发表于 2010-4-29 23:28:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-30 08:53:39 | 显示全部楼层
玛瑞咖。

出0入0汤圆

发表于 2010-4-30 09:22:38 | 显示全部楼层
回【14楼】
言之有理,曾经在网上研究了一阵区位码之类的东东,最后还是GDI输出到画布上提出出来!这个方法简单易懂,提高开发效率,呵呵~!上传一个我曾经测试的代码以供参考,用C#写的。。。

C#提取字模测试程序ourdev_550502.rar(文件大小:87K) (原文件名:bitmap字模.rar)


(原文件名:C#提取字模.jpg)

出0入0汤圆

发表于 2010-5-3 00:33:49 | 显示全部楼层
mark!!!

出0入0汤圆

发表于 2010-5-3 12:52:49 | 显示全部楼层
mark~~~

出0入0汤圆

发表于 2010-6-8 14:16:18 | 显示全部楼层
18楼高手

出0入0汤圆

发表于 2010-6-8 14:41:06 | 显示全部楼层
mark~~~

出0入0汤圆

发表于 2010-6-8 14:47:26 | 显示全部楼层
18楼好东西!

出0入0汤圆

发表于 2010-12-21 17:13:37 | 显示全部楼层
学习了,谢谢

出0入0汤圆

发表于 2010-12-21 17:17:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-29 09:57:36 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-9-14 14:18:02 | 显示全部楼层
回复【22楼】damoplus
-----------------------------------------------------------------------

很不错
谢谢

出0入0汤圆

发表于 2011-9-25 17:44:08 | 显示全部楼层
哦~~~原来如此

出0入0汤圆

发表于 2011-10-27 14:33:59 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-1-30 17:07:56 | 显示全部楼层
回复【18楼】dachun  
-----------------------------------------------------------------------

能否将软件上传上来?

出0入0汤圆

发表于 2012-1-31 22:27:15 | 显示全部楼层
字符和汉字混合取模。
能否生成BIN文件?

出0入4汤圆

发表于 2012-7-10 22:56:18 | 显示全部楼层
学习了。

出0入0汤圆

发表于 2012-7-27 11:49:47 | 显示全部楼层
14楼 你好 那个软件名字是什么

出0入0汤圆

发表于 2012-7-31 21:38:42 | 显示全部楼层
我的办法是在一个VIEW把字显示出来然后读点....

出0入0汤圆

发表于 2012-8-2 16:56:51 | 显示全部楼层
cool                                                                    

出0入0汤圆

发表于 2012-9-13 17:43:56 | 显示全部楼层
4楼和19楼 牛人!

出0入0汤圆

发表于 2012-11-17 21:05:20 | 显示全部楼层
怒马!我也正在开发4级灰度显示屏,苦于字模提取

出0入0汤圆

发表于 2014-3-19 16:52:18 | 显示全部楼层
膜拜下19楼前辈···今天看了一天了···头都大了··

出0入0汤圆

发表于 2014-3-19 18:43:31 | 显示全部楼层
jerry0917 发表于 2012-7-27 11:49
14楼 你好 那个软件名字是什么

好古老的帖子了 呵呵 那是我09年的毕设!

出0入0汤圆

发表于 2014-3-19 18:45:41 | 显示全部楼层
kalo425 发表于 2014-3-19 16:52
膜拜下19楼前辈···今天看了一天了···头都大了··

弄明白提取方法和原理,应该很好理解的

出0入0汤圆

发表于 2014-4-19 17:35:13 | 显示全部楼层
谢谢19楼,学习中

出0入0汤圆

发表于 2014-6-4 18:14:04 | 显示全部楼层
谢谢4楼的精彩讲解

出0入0汤圆

发表于 2018-12-4 13:19:23 | 显示全部楼层
取模算法
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 13:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表