主题:汉字提取程序
飞鸟12
[专家分:2830] 发布于 2005-07-31 15:19:00
程序是在qb45的基础上加以改进 而成的,
提取后的字库在hzdata.bas中(见1楼)
前景色为红色,背景色为绿色
DECLARE SUB getzk (hz.word$)
OPEN "hzdata.bas" FOR OUTPUT AS #1
OPEN "hzk12" FOR BINARY AS #2
OPEN "asc16" FOR BINARY AS #3
hz1$ = "你好啊!aAbBcCdD"
CALL getzk(hz1$)
CLOSE
RUN "hzdata.bas"
END
SUB getzk (hz.word$)
hzlen = LEN(hz.word$): toprint = 0
FOR now = 1 TO hzlen
qu = ASC(MID$(hz.word$, now, 1))
IF qu > 161 THEN
qu = qu - 161: now = now + 1
wei = ASC(MID$(hz.word$, now, 1)) - 161
ps& = (qu * 94& + wei) * 24 + 1
SEEK #2, ps&
zimo$ = INPUT$(24, #2)
PRINT #1, "'"; MID$(hz.word$, now - 1, 2)
PRINT #1, "DATA ";
FOR y = 1 TO 12
hzchr$ = MID$(zimo$, 2 * y, 1) + MID$(zimo$, 2 * y - 1, 1)
PRINT #1, HEX$(CVI(hzchr$)); ",";
NEXT y
PRINT #1, 0
toprint = toprint + 1
ELSE
PRINT #1, "'" + CHR$(qu)
SEEK #3, qu * 16
zimo$ = INPUT$(16, #3)
PRINT #1, "DATA ";
FOR y = 3 TO 14
zmchr$ = CHR$(0) + MID$(zimo$, y, 1)
PRINT #1, HEX$(CVI(zmchr$)); ",";
NEXT y
PRINT #1, 0
toprint = toprint + 1
END IF
NEXT now
PRINT #1, "SCREEN 12"
PRINT #1, "FOR i = 0 TO"; toprint - 1
PRINT #1, " FOR j = 0 TO 12"
PRINT #1, " READ fon$"
PRINT #1, " font = VAL(" + CHR$(34) + "&H" + CHR$(34) + " + fon$)"
PRINT #1, " LINE (100 + 14 * i, 100 + j)-STEP(15, 0), 12, , font"
PRINT #1, " LINE (100 + 14 * i, 100 + j)-STEP(15, 0), 10, , &HFFFF - font"
PRINT #1, " NEXT j"
PRINT #1, "NEXT i"
PRINT #1, "END"
END SUB
回复列表 (共11个回复)
沙发
飞鸟12 [专家分:2830] 发布于 2005-07-25 15:22:00
下面就是hzdata.bas,可以直接运行
'你
DATA 1200,1200,27F0,2420,6940,A100,2540,2520,2910,3110,2500,2200, 0
'好
DATA 2000,27E0,2040,F880,4880,48A0,57F0,5080,3080,2880,4A80,8100, 0
'啊
DATA 2020,FFF0,AA20,AFA0,AAA0,AEA0,AAA0,EBA0,AC20,820,8A0,860, 0
'!
DATA 0,0,0,1800,3C00,3C00,3C00,1800,1800,0,1800,1800, 0
'a
DATA 0,0,0,0,0,0,1A00,2200,4200,4200,6600,3B00, 0
'A
DATA 0,0,0,600,A00,1200,1200,2200,7F00,A200,A200,4200, 0
'b
DATA 0,0,0,4000,4000,4000,4800,5400,4E00,4200,4600,7C00, 0
'B
DATA 0,0,1000,1E00,3100,5100,5600,5100,5100,5300,5500,2600, 0
'c
DATA 0,0,0,0,0,0,3C00,4200,8400,8000,4200,3C00, 0
'C
DATA 0,0,0,1E00,3300,6100,4200,4000,4000,6000,3100,1E00, 0
'd
DATA 0,0,0,600,A00,A00,6A00,8A00,8A00,8400,CA00,7100, 0
'D
DATA 0,0,1000,3C00,5200,3100,1100,1100,1100,1100,7100,5E00, 0
SCREEN 12
FOR i = 0 TO 11
FOR j = 0 TO 12
READ fon$
font = VAL("&H" + fon$)
LINE (100 + 14 * i, 100 + j)-STEP(15, 0), 12, , font
LINE (100 + 14 * i, 100 + j)-STEP(15, 0), 10, , &HFFFF - font
NEXT j
NEXT i
板凳
zys [专家分:0] 发布于 2005-07-26 14:22:00
此程序在QB7.1下编译后运行不了啊,怎样回事?
3 楼
moz [专家分:37620] 发布于 2005-07-27 02:44:00
1. 我只装了简装的UCDOS
没有HZK12这个点阵文件
只有HZK16的点阵字库
2. 如果让我来做,
我不会转换那么多的DATA来.
如果一定要把那些点阵信息提取出来
我会用文件来储存
我把你的程序研究了一翻,
然后又学习了置顶那里你发的代码优化的一点皮毛
改写如下,剽窃的感觉真好.呵呵,别介意.
唯一的缺点就是我还没有把半角字符包含进来,
呵呵,来不及了,过几天再想想怎么区分好了.
提取字符点阵信息另存为文件
'[color=FF00FF]我的是16x16的点阵,可以用变量来区分的[/color]
hz1$="你好啊"
open "hzk16"for binary as #1
for i=1 to len(hz1$) step 2
seek #1,((asc(mid$(hz1$,i,1))-161&)*94&+asc(mid$(hz1$,i+1,1))-161&)*32+1&
zimo$=zimo$+input$(32,#1) '[color=FF00FF]估计长度不会超过16383吧?[/color]
next
close #1
open "zimo" for output as #1
print #1,zimo$;
close #1
按照分而治之的思想,显示的程序如下:
open "zimo" for binary as #1
zimo$=input$(16383,#1)
close #1
screen 12
def seg=&HA000
o=y*80+x\8+80*16-2-79 '[color=FF00FF]x,y为图形屏幕的坐标值[/color]
for i=1 to len(zimo$)
if i mod 2 then o=o+79 else o=o+1
if i mod 32=1 then o=o-80*16+2
poke o,asc(mid$(zimo$,i,1))
next
def seg
4 楼
飞鸟12 [专家分:2830] 发布于 2005-07-27 14:30:00
回二楼的 zys
问题可能有几方面原因,有没有字库是比较重要的一个
字体文件[url]http://upload.programfan.com/upfile/20050727144535.zip[/url]
我会继续把字库发到 qbasic45@163.com pw:11111111
另外,程序中的 RUN "hzdata.bas" 经编译后无法运行,可以去掉这一句
还没想到怎么输入汉字(我都是在记事本中进一步修改源程序)
不过,因为程序主要是为得到 一楼的hzdata.bas,所以也就不要编译
或者能找到方法使得编译好的程序 能够输入汉字,那就好办了
回三楼的 moz
程序运行正常 只是少一个 “1”
对于视屏存储区的编程 我也正在看书,不知moz有什么资料可供学习
5 楼
moz [专家分:37620] 发布于 2005-07-27 16:24:00
哦? 是什么地方少了一个"1"?
[url=http://www.metc.pku.edu.cn/cgz/computer/assembler/assembler_u/13/tsld015.htm]我只有这个[/url]
其他资料就没有了
我的铁头是靠撞出来的
13.3 EGA/VGA适配器原理
②图形模式
关键点: 像素位置(X,Y)与VRAM地址的对应关系。
例如,VGA18号模式下,640X480,16色,四面,基地址:A0000H。
对于屏幕上的任意一点(X,Y),求该点在VRAM中的字节位置和字
内位置。
像素颜色的决定:像素的可选颜色为16色,因此需要用4位表示,该四
位分别存于四个位面,只占每个位面一位,因此VRAM的每个字节对应
显示屏的8个像素。
每行需要640/8=80字节
像素所在字节数:Y*80+X/8
像素所在字节内的位置:7-X MOD 8
7 6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
VRAM
A000:0000
A000:0001
A000:0010
6 楼
飞鸟12 [专家分:2830] 发布于 2005-07-30 10:05:00
close #1
open "zimo" for output as #[color=FF0000]1[/color]
print #1,zimo$;
另外就是GET/PUT
SCREEN 12下 GET (0,0)-(18,8),a a()中的数据关系 是?
7 楼
moz [专家分:37620] 发布于 2005-07-30 10:39:00
哦? 这个没算过,但估计不难.
随便猜猜再试试就可以知道了.
无非是一个数组元素储存一个屏幕像素
搞清楚顺序,弄清楚数值不就得了?
8 楼
moz [专家分:37620] 发布于 2005-07-30 10:43:00
昨晚我才发现,
在UCDOS98里
(这个98版是网友动过手脚破解出来的)
包含有一个程序叫 TM
它可以提取点阵信息,生成新的EXE文件,
来实现无汉字系统显示汉字的.
具体在UCDOS目录下运行一下readme就能看得到的了
9 楼
飞鸟12 [专家分:2830] 发布于 2005-07-30 11:10:00
对于 SCREEN 13下的 GET倒是简单,很容易就看出来了
SCREEN 12下的 则不是很明白
10 楼
moz [专家分:37620] 发布于 2005-07-30 11:16:00
等我算好了告诉你
我来回复