回 帖 发 新 帖 刷新版面

主题:汉字提取程序

程序是在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个回复)

沙发

下面就是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

板凳

此程序在QB7.1下编译后运行不了啊,怎样回事?

3 楼

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 楼

回二楼的 zys
    问题可能有几方面原因,有没有字库是比较重要的一个
    字体文件[url]http://upload.programfan.com/upfile/20050727144535.zip[/url]
         我会继续把字库发到  qbasic45@163.com   pw:11111111
    另外,程序中的 RUN "hzdata.bas" 经编译后无法运行,可以去掉这一句
          还没想到怎么输入汉字(我都是在记事本中进一步修改源程序)
    不过,因为程序主要是为得到 一楼的hzdata.bas,所以也就不要编译
       或者能找到方法使得编译好的程序 能够输入汉字,那就好办了
回三楼的 moz
    程序运行正常  只是少一个 “1”
    对于视屏存储区的编程 我也正在看书,不知moz有什么资料可供学习

5 楼

哦? 是什么地方少了一个"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 楼

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 楼

哦? 这个没算过,但估计不难.
随便猜猜再试试就可以知道了.

无非是一个数组元素储存一个屏幕像素
搞清楚顺序,弄清楚数值不就得了?

8 楼

昨晚我才发现,
在UCDOS98里
(这个98版是网友动过手脚破解出来的)
包含有一个程序叫 TM
它可以提取点阵信息,生成新的EXE文件,
来实现无汉字系统显示汉字的.
具体在UCDOS目录下运行一下readme就能看得到的了

9 楼

对于 SCREEN 13下的 GET倒是简单,很容易就看出来了
SCREEN 12下的 则不是很明白

10 楼

等我算好了告诉你

我来回复

您尚未登录,请登录后再回复。点此登录或注册