这些天我一直在想一种比较简便的制作任意字体大小图片字库的方法。 ' _- W7 h) B8 h$ }5 U+ r% k$ T
注意,是任意字体大小,不是任意图片大小。 / X3 V f, l( Z& ~5 O% W
下面简单说一下方法。 / P: D' q' J- \, y. N# d
# N A( K$ u( ?4 R6 H( e) Q
首先我们用一个制作点阵字库的工具制作一个点阵字库,字体的高度和宽度可以任意设定,不过我们一般来说设为相等的。
8 {$ O# W; F5 R) V* U( M2 L" t, o! D具体的高度和宽度我们可以参考原来的字体,找一个差不多的高度和宽度就可以了.
& V5 P$ g* j; x/ @$ p接下去我们可以这么做 ( D) ~: r% F( A( X5 F* t
1 q/ q5 A! ~3 p$ y; F0 P( L1.用任意点阵字库制作工具制作字库
; F: O1 r) k$ G, A( I+ f 由于是工具根据TTF字库制作出来的点阵字体,所以字体的大小一致是有保证的。 9 A9 t9 w! R& x; N7 X5 C
任意点阵字库制作工具如下
, C. o0 t; m" q, T( d+ vhttps://www.chinaavg.com/read.php?tid=17138
3 Q$ }) ^1 y1 z) P: K6 t1 C任意点阵字库查看工具如下 ! X2 c% Q; V1 S
https://www.chinaavg.com/read.php?tid=16610 5 i! X8 s$ j' M, _4 x/ @" X' ]
& F, ^/ K- \; ^4 {0 k' P; F
2.准备好我们需要的汉字
1 v/ s$ s3 q1 B% R 用工具制作出来的字库是包含了所有的汉字,所以我们需要先把我们需要汉化的字幕翻译好,整理出其中不重复的汉字。
`0 @% \$ o+ p( f( _7 L# E6 f& g0 k9 e# l% D5 Q' d
3.在tga中写入我们需要的汉字
2 [1 b2 @/ K# A& ]/ X. f 有了我们需要的不重复的汉字列表,还有一个全汉字版的点阵字库,我们就可以进行汉字抽出和变换工作了。 3 m& v( n' L g8 C: t
首先我们要解释一下这个任意点阵字库制作工具生成的字库的格式,这个工具是采用字节对齐方式来生成字库的。
' @4 m# r; B9 \* n 什么叫字节对齐?
; q: @3 u$ J# T( C6 ~ 比方说,一个字节有8个bit,可以表示8个点的状态,那么16X16的点阵字库一行像素需要16位也就是2个字节来表示。一个汉字就需要32个字节来表示。那么如果我们的汉字是17X17的呢?1行用2个字节就不够了,1行最后那个点虽然只需要用一个位来表示,但是也占用了一个字节, 8 p+ s' _1 n# a7 ?
2 S% i; h) [4 [5 L7 u& ^ f
这就叫字节对齐。所以17X17的汉字需要17X3=51个字节来表示。 8 Q, y- h$ P8 ?2 H$ g. {3 o/ H- O
% m# s. ?; Z; g6 k$ }2 e: \ 好,理解了这些。我们可以找到一个汉字在字库中的字模并且取出字模了。 5 T# O. D3 o) D7 }3 T2 a9 j% C B" E
光取出字模还不够,我们还要把它变换为我们需要的tga图片字库文件。 ) f) p" d2 o; w- O p4 X
字模是用一个字节中的一个bit来表示一个点(我忘了是用0还是1来表示有点了,假设是1)。
/ J, [# W" a2 |) r# C 而tga图片是用FF FF FF FF 来表示一个有色点,FF FF FF 00来表示一个透明点。
" l3 A) A$ C& |. {3 V 我们要做的是把字模中的1转换为tga图片中的有色点,把字模中的0转换为tga图片中的透明点。
6 ?* H2 {5 T Z2 Y3 e
4 J) t" s6 e# S# M7 V, T e7 j$ QGB索引代码如下 1 Y8 J+ w A9 _: I
idx = ((idx % 256) - 0xa1)* 94 + ((idx / 256) - 0xa1); " j0 o' y3 F" w4 B" O
, f b9 l, P- Y' X8 S4.XML
) x2 \# p0 E( S; Q3 u" E7 r 把字库tga文件生成好以后还要生成配套的XML文件。 9 c9 a0 w2 {1 o6 F: y; ~0 n
这个应该比较好理解,我就不多作解释了。 ) z# I9 ~6 w2 ?4 ?
根据字体的高度和宽度以及在tga中的位置来生成就行了。
- K) \" Z' \: g4 k4 V7 t% u/ D) C" D l9 R8 g4 X6 v4 u
------------------------------------------& y p# w: r ]" W( A
2009.6.7 更新& p& c7 m6 |+ H
我再补充一下,我们还需要做2件事。; V2 d1 Z: r, k! c
$ h0 ~$ g. S y: K6 b4 v
1.生成码表
1 ~% O- P0 G% |7 I6 L2 c 码表就是中文字符和xml中定义的ascii码的对应表。具体的格式可以自由定义,只要我们自己编的程序能够识别就行了。7 {0 Z5 r0 b2 |; t
2.转换生成菜单字幕文件7 s& q& K' @" F
菜单字幕文件的原始内容是一个ID对应一个英文字符串
" U1 G; B3 [% i' E$ N 我们要先把它转换成一个ID对应一个中文字符串,然后到码表中寻找每个中文字符对应的ASCII码,再把它写回到菜单字幕文件文件中即告完成主菜单的全部汉化工作。 |