標題: 如何獲得漢字點陣信息 [打印本頁]
作者: 51黑黑黑 時間: 2016-2-24 18:15
標題: 如何獲得漢字點陣信息
摘要:本文敘述了漢字庫的結構及漢字點陣信息的獲得方法,并用VisualBasic5.0進行編程,調用UCDOS中48*48(48行乘48列)點陣的漢字庫,獲取漢字點陣數據,顯示在文本框中,同時在圖片框中用畫點的方法把該漢字畫出來。這是15年前自己寫的一篇論文,好像還有參考價值,特收錄在此。
1.48*48點陣漢字庫的結構
大家在計算機屏幕上看到的漢字是由一系列的點構成的,如果用針式打印機把漢字打印在紙上,可以更清楚地看出是由一組黑點組成,這組黑點可能是24*24的點陣,如果是16*16的點陣看得就更清楚,如果是48*48點陣,因為單位面積的點數增加,就看不出是由點組成的漢字了。計算機在顯示或打印漢字時要調用漢字庫。
因為每個字節(8位的二進制數)數據可以描述8個點,(1代表黑,0代表白),所以用6個字節的數據就可以確定48個黑白點,48*48點陣漢字數據的前6個字節描述第一行的48個點,接著的6個字節描述第二行的48個點,依此類推,最后的6個字節描述第48行的48個點,如此構成48*48點陣的一個漢字,所以一個48*48點陣的漢字需要288個字節的數據。如果是一個16*16點陣的漢字,就可以用2個字節描述一行16個點,接下來的2個字節描述下一行的16個點,依此類推,一個16*16點陣漢字需要32個字節數據就夠了。所以16*16點陣漢字庫要比48*48點陣漢字庫小得多。
國標漢字編碼表(GB2312-80)是一個二維表,有94行94列,最多可容納94*94=8836個漢字或符號,而實際上則包含6763個漢字,另外還有一些符號,其余都是空位。對編碼表的行和列進行編碼可以得到區位碼,就是把漢字在編碼表上對應的區號和位號合起來得到的四位數字編碼,表中的行為區,區號在前,表中的列為位,位號在后,比如“啊”字的區位碼是1601,即16區01位,(前15區是符號)。
UCDOS中fnt子目錄中的“hzk48s“文件,就是48*48點陣的宋體漢字庫,它占據1904K字節。包括了國標區位碼中94個區,每區94個位的所有漢字,漢字庫是按照先區后位順序存儲漢字的。先存第一區的94個漢字,再存第二區的94個漢字,依此類推,參見區位碼表。所以48*48點陣漢字庫的結構是,先是第一區的第一位的288個字節,然后是第一區的第二位的288個字節。如此,最后是87區的第94個漢字的288個字節。
2.如何獲取漢字的點陣信息
獲得48*48點陣信息的方法是:比如要得到“啊”字的48*48=288個字節的點陣信息,1)首先要知道“啊”字的機內碼,這里還是先介紹一下機內碼的概念,機內碼是使用編碼表的二進制值編碼,由2個字節的代碼組成。行為第一字節,列為第二字節,第一、二字節的最高位均設置為1,例如“啊”字編碼表中行、列對應的二進制值1011000010100001,轉換為十六進制數得B0A1,此為“啊”的機內碼。機內碼可以通過VB編程得到:zf$ =“啊” ,zf1 =Hex(Asc(zf$)),此時zf1=B0A1就是“啊”的機內碼的十六進制數,參見程序8~9行。
2)然后要得到“啊”字的區位碼。“啊”字所在的區和位的位置,可以通過查區位碼表得到,也可以通過區位碼和機內碼的轉換公式得到。區位碼和機內碼的十進制數轉換公式是:Q(區碼)=機內碼第一個字節-160,W(位碼)=機內碼第二個字節-160。通過對上述公式進行編程可以得到區碼q$= "&H" & Left(zf1, 2) ,q = Val(q$) –160,位碼w$ = "&h" & Right(zf1, 2) ,w = Val(w$) –160,此時q=16,w=01,“啊”字的區位碼是1601。參見程序10~13行。
3)有了區位碼,下面的問題就是如何通過區位碼找到“啊”字的點陣信息,上面說到漢字的點陣信息在漢字庫中是按照區、位存儲的,每個48*48點陣的漢字占288個字節,那么,某個漢字的點陣數據與該漢字的區、位碼必須存在一定的對應關系,這個對應關系是:m = ((q - 1) * 94 + w - 1411) *288,其中m就是我們要找的該漢字的288個字節點陣數據的起始位置,q是區號,w是位號。利用這個公式,通過VB編程,(參見14行程序)可以很容易的讀取ucdos中漢字庫二進制文件中的“啊”字的48*48點陣數據如下:0000000000000000000000000000000000000000000000000003810000C00003838001E01823FFFFFFF01C73870007001FFB870007001C73860007001C738E0007001C738C0007001C738C0007001C73880007001C73986087001C739071C7001C73907FE7001C73B071C7001C73A071C7001C73A071C7001C739071C7001C739871C7001C738871C7001C738C71C7001C738C71C7001C738671C7001C738671C7001C738671C7001C738771C7001C73877FC7001FF38771C7001C738771C7001C738E71C7001C63FE6007001C039C0007001C03880007001C03800007001C038000070000038000070000038000070000038000070000038000070000038001FF00000380003F00000380001E00000380000C00000000000000000000000000。
3.如何驗證所得到的數據就是“啊”字的48*48點陣數據呢?一是可以在紙上畫出48條行線和48條列線,在行列的交叉點上描點的方法,先描第一行的6個字節6*8=48個點,接著再描第二行的48個點,依此類推,描完48行就能看出這個漢字的模樣了,這種方法太麻煩,下面介紹一種用計算機描點的方法:首先取一個字節的點陣數據,然后把該數據的每一位分離出來,分離的方法就是把十進制數轉換為二進制數的方法,即“除二取余”,被轉換的數被2去除,如果能夠整除則取0,不能被整除則取1,參見程序36~44行。然后根據掃描數據的每一位判斷是0還是1,是1就在屏幕上畫一個紅點,是0就在屏幕上以背景色畫一個不可見的點,參見程序45~53行。
4.編程方法:利用VisualBASIC5.0進行編程調用漢字庫點陣信息非常方便。程序1~6行是設置全局變量,7~33是命令按鈕的事件過程,其中8~14行的作用前面已經敘述,15~20行是讀取數據文件。21~22行的作用是對數據進行處理,23行是把數據顯示在文本框中。24~33行是為了描點而設置x和y坐標。35~54行是在圖片框中把漢字畫出來的子程序,前面已經說明。Form表單上放置text和picture控件和一個命令按鈕。屬性采用默認值。
5.程序清單如下:
1. Dim aAs Byte
2. Dimb
3. Public c
4. Dimpx
5. Dimpy
6. Dim kAs Integer
7. Private Sub Command1_Click()
8. zf$ ="啊"
9. zf1 =Hex(Asc(zf$))
10. q$ ="&H" & Left(zf1, 2)
11. w$ ="&h" & Right(zf1, 2)
12. q =Val(q$) - 160
13. w =Val(w$) - 160
14. m =((q - 1) * 94 + w - 1411) * 288
15. Open"d:\ucdos\fnt\hzk48s" For Binary As #1
16. py =0: px = 0
17. For i= 1 To 288
18. m = m+ 1
19. Seek#1, m
20. Get#1, m, a
21. b =Hex(a)
22. IfMid$(b, 2, 2) <= "&0f" Then b = "0" & b
23. Text1.Text = Text1.Text + b + Chr(10)
24. b =a
25. Callhuahanzi
26. If i/ 6 <> Int(i / 6) Then
27. px =px + 8
28. Else
29. py =py + 1
30. px =0
31. EndIf
32. Nexti
33. Close
34. EndSub
35. Public Sub huahanzi()
36. For k= 1 To 8
37. c = b/ 2
38. If b/ 2 = Int(b / 2) Then
39. s = 0& s
40. Else
41. s = 1& s
42. EndIf
43. b =Int(c)
44. Nextk
45. ForL= 1 To 8
46. Picture1.DrawWidth = 1
47. Picture1.ScaleMode = 3
48. IfMid$(s, L, 1) = "1" Then
49. Picture1.PSet (px + L, py), QBColor(12)
50. Else
51. Picture1.PSet (px + L, py), BackColor
52. EndIf
53. NextL
54. EndSub
作者: dqm123 時間: 2018-12-10 20:42
又沒有 32*16的
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
狠狠做深爱婷婷综合一区
|
国产精品亚洲视频
|
国产一级片免费看
|
精品国产乱码一区二区三区
|
久久草视频|
午夜资源
|
午夜在线影院
|
国产在线观看网站
|
天堂va在线|
97起碰|
91九色视频
|
中文字字幕一区二区三区四区五区
|
国产精品成人一区二区三区
|
国产成人精品免费视频大全最热
|
久久新视频|
国产婷婷|
国产色视频网站
|
www.精品一区|
国产日批|
在线精品国产
|
久久久久久久久99
|
午夜影院网站
|
久久久久久av
|
色婷婷一区二区三区四区
|
国产精品爱久久久久久久
|
久久精品久久久
|
日韩成人在线视频
|
日韩中文在线观看
|
欧美激情a∨在线视频播放
成人免费共享视频
|
国产精品一区二区三区在线
|
亚洲一区自拍
|
www.成人.com|
久久无毛
|
国产精品美女久久久久aⅴ国产馆
|
91在线网|
亚洲精品一级
|
亚洲天堂精品久久
|
九一精品
|
狠狠躁躁夜夜躁波多野结依
|
欧美日韩在线看
|
久草精品视频
|