先挖个坑,慢慢填& R/ g2 c0 k+ V% [9 n
8 F$ H Y2 C% O9 T计划包含两个工具
0 i8 S4 N' W W9 v6 b9 h* i$ g6 B其一,cif文件——解压缩——转换成bmp图
) V! F9 R' x) D* P& g5 T( b$ l其二,bmp图——逆转换——压缩成cif文件
^* Y8 _5 T) _( {3 I& d/ g0 |8 j8 {9 |9 B
第一个应该要实现批量转换,就是读取Ciftree.dat头部文件表,然后将所有图片文件解压缩,转换
$ @1 T4 j0 V& a. x( W3 S# q9 x第二个只需要单张处理就行了,毕竟相对于原来的大量图片,需要PS的只是很少的部分
) g4 Y* e1 T( B3 R& {# }% _4 H- G: ~8 ^8 Q
————————————————————————————————————————————
+ O% n! f7 K# c' tND16、17图片文件格式详解:
4 r: f, Y- G5 \: M5 _/ Z. s: T& e- u, G* c8 x* g3 _
首先判断是不是图片,可以在Ciftree.dat的头部文件表里文件名后14个字节的地方看看有没有数据,此处存放是图片宽高像素,各4个字节,基本上两个数据都不等于0就是图片了
1 s9 ^9 {! `# y0 E
' z1 ?# ], [/ r图片文件在lzss解压缩后数据结构是 文件头+bmp图像RGB数据
6 p0 }8 x: s( J" }0 E
y3 g, N8 M( k5 Z! g' A. o& ]其中,图片有两种格式,一种是32位图像,一种是24位图像
: o @% D/ c- k4 ]# x2 U' w前者的文件头长度是18个字节,后者的文件头长度是31个字节(其中还有字串“Contains”)<—(有误,见下面更新)
5 L+ W- Z$ K4 d5 m3 X3 m' _+ ?. @' @( ]& i
具体判断方式是 宽像素*高像素*4和文件大小比较6 l: G) o1 Q* Y P3 n4 W }
如果是32位图像,则文件大小比上述计算所得值大18个字节1 i9 t5 ]# z& [- h& R9 \! {1 i
如果是24位图像,则文件大小比上述计算值小,应该是等于 宽*高*3+31
& e: d# I; i- Q" _5 t+ D( T
" x0 j2 a4 h" s' T9 C7 I文件头之后就是图片的RGB数据,32位图像是4个字节表示一个像素,而24位图像是3个字节表示一个像素,这也就是为什么上面要乘3、4的原因。
5 W+ D# \: S0 N3 @) e' }+ _% ]( \) g
转换工作,32位图像很简单,去掉那18个字节的文件头,然后填上32位BMP图像的文件头就可以了,BMP图像文件头数据比较简单,网上资料很多,这里就不详述了。! r1 |. l5 D' B, k# T
( m1 F6 x+ v% i24位图像转换要稍微麻烦点,因为24位bmp图片在显示时,如果每一行字节数不是4的倍数,就需要补足字节,举个例子,39*33的图片,每行的字节数是39*3=117,不是4的倍数,因此每一行都要补3个字节。同时文件大小和RGB数据大小也改变了,在写文件头的时候也要注意。0 ?- B4 b8 V, K
( z F& u% }: ]4 o& ]5 s# D/ O( q需要注意的是,存放的RGB数据是逆向的,如果直接复制,转换出来的图片就是倒着的,所以要先读取最后一行的RGB数据,然后从后往前读,最后输出的才是正向的图片。
0 s2 ]2 s& a0 j3 ^
4 [; a% E# U, c% q: s+ `9 f- ?
; u+ t8 {8 _. N2 z3 m至于逆转换,就是上面说的那些倒过来做一遍,不多说了。
, g: I* j' C( h- Q+ y, O; e" f9 o2 Y7 I3 A
——————————————————————————————————————————* Y$ N8 L9 T! k& J% L
以上是理论部分,至于实践部分,目前完成了单张图片的正向转换工具
1 v: c0 P4 g+ D. f
. E$ {1 @+ j. Q% u使用方法:
$ p, d0 h/ h9 [, l$ V) g0 Q8 D 把待转换的文件和head文件和工具放在一起,命令提示符下convert filename,程序就会自动找出head里对应的文件,读取宽高像素,解压缩,转换。* x8 Y7 L/ P2 Q$ v1 h
4 w1 r9 A. Y7 x5 C
附件包里包括了工具、head文件、一个待转换文件、一个我写完命令的bat文件,有兴趣的童鞋可以下下来解压,直接运行那个.bat,如果正常的话,你可以在目录下找到一个lzss解压缩后的文件和一张转换完成的图片。
- g- J* e$ r- w( o6 f: a% ]8 C& X$ ]% P0 N
——————————————————————————————————————————
$ `1 F+ N+ X8 m8 P+ ?4 F* N) S) p# i6 I* N) @+ v
其实呢,本来批量转换的代码都写好了,但是由于原来的lzss解压工具无法重复运行,批量转换工具暂时难产了。+ j# g3 e2 ~9 _9 U3 o' J0 ?
就是说我将那解压缩代码添到工具里后,重复执行解压缩程序后,只有第一次能正常解压,后来解压缩出来的文件数据都是错掉的。7 s; x8 s% a/ R) g- F5 `7 b4 j! C
' N3 k; Y& x" ^, G: s0 Y/ {
最简单的如下代码也只有file1能够正常解压,file3解压出来的数据有错误* _, f! B) M* X# S
main(){# J& u% C, t* c1 a2 @- s
lzss(2,file1,file2); // 2代表解压,前一个文件是源文件,后者是解压后生成文件
5 @8 b( U' p6 N. vlzss(2,file3,file4);
+ |& F2 m) w% M! }# l3 t}
. U1 L) @+ H3 O7 u8 y
; _' ]. w4 l3 y: }- q* g/ H可能是我添代码的时候出了问题,也可能是原来解压程序的代码有问题,运行完部分数据没有初始化。正在研究中.....
p1 w. v5 j; p+ ~( \
( O4 I0 m& u2 U0 g6 d未完待续..../ v6 H. F: [1 V3 v0 F. R
——————————————————————————————————————————
3 u4 N: r4 k' u8 |" p* w% j3 u3 C09.09.16更新
5 }4 n) q# v/ D$ K
- t7 u' a! ?8 L- ?昨晚睡觉时突然想到,批量转换其实也可以用批处理.bat文件完成,这样就不需要再编程了
) u& Q0 g- b9 ~ a( x9 a当然效率会比编好的程序低一点,不过一个小工具,问题不大。) T) N" c* l- ]* y( v/ o
具体就是建立一个.bat文件,依次输入:
5 p+ A6 x8 J% D3 O" d$ s! o) x6 o# a7 Q. S0 {
convert BRU_DESKBOOK_OVL
7 Z6 G( e0 A8 \+ H( d. k) P( J: fconvert BRU_DESKEYE_OVL) P( `, @4 d7 D) |, P9 n# O
convert BRU_EYEGRIDOPEN01_OVL5 @1 N3 \' [1 |8 `
convert BRU_EYEGRIDOPEN02_OVL
( E( n% H- C, D. \; I+ B* y; G6 Q0 l# D……
2 p- F2 S0 x O$ ~% q0 }( Z) S……
" Y" K, H, I9 c' N
2 a: u* Y6 @9 T V/ i- v就行了,当然,几百张图片不可能手输,几行代码就可以搞定了,附件包里增加一个convert17.bat
, y: m. \! W8 _$ v7 T& E( A9 P就是ND17所有图片文件的批处理文件。
' P6 V) ]# J7 Q3 L2 y6 d使用方法就是把convert17.bat和convert.exe还有解包后的那一堆文件放在一起,运行.bat文件就行了。
4 S: w# e! y% X" G( a
3 W. N* K9 q" m) g5 X8 D3 K6 J' Fok,下一步开始制作逆转换工具
( f1 J2 `. R; `, p' y) r————————————————————————————————————————————
9 e$ R# b5 Y9 |* Z+ C2 L W09.09.19更新
8 v8 k. ?0 ]2 z% V6 I终于熬到双休日了,真是痛苦的一周╮(╯_╰)╭
/ b( |) Y& S/ Q# ]8 V5 c
5 c) K5 P7 W8 t# T P; g3 c- D* n. e首先,对上面文件格式分析的一个勘误,并非所有24位图像的文件头都是31个字节
5 P$ Y# X" A4 W; y& v* [也有一部分的文件头是18个字节,具体什么情况出现31个字节文件头尚不清楚,可以知道的是31个字节文件头中含有字串“Contains”,辨别文件头有几个字节可以直接 文件size-宽*高*3 计算而得
9 z/ v1 G% a. L* y: Z5 Q; _( u$ k) S; T5 K* M3 v' f) m
其次,更新逆转换工具/ v$ i/ ~0 b4 v j0 X
使用方法:将工具和转换后的bmp图像,正转换过程中生成的.pic文件(就是cif文件解压缩所得,用来提取文件头)放在一起,命令提示符下输入convertback FILENAME即可,FILENAME无需后缀名,例如像转换工具一样只需输入convertback BRU_DESKBOOK_OVL即可6 p, M& U0 K& \6 [( q
4 o B+ r' J8 W d因为之前加入lzss代码出现了例如不能重复运行等种种问题,所以逆转换工具暂时不添加lzss压缩的代码。就是说转换后的还是pic文件(FILENAMEnew.pic),需要另外运行南希lzss解压缩工具nancylzss.exe。
( a* H& f4 E3 m E具体使用时还是可以用bat文件来达到批量操作。
! k6 a/ J, X/ o0 z0 A
: \9 m* w! U# s: V W/ I _+ S图片汉化流程:- J% Y' P. A/ U! w2 O
$ n% ?+ U) n/ q0 l5 c1、用convert17.bat转换所有图片文件
& |4 a7 Q3 F- }# J2、查看所有图片,找出、PS需要修改的图片
L$ O* a& F, K2 a7 W- _/ a3 j: N3、建立一个convertback.bat,依次输入需要转换的图片,例如:
( b' j0 m5 n, A7 ^ convert BRU_DESKBOOK_OVL
* h' x9 \. N) W( V nancylzss e BRU_DESKBOOK_OVLnew.pic BRU_DESKBOOK_OVLnew
: A+ `3 m2 E# O7 Q& K convert BRU_DESKEYE_OVL: h) y8 [; Z5 U3 M* R
nancylzss e BRU_DESKEYE_OVLnew.pic BRU_DESKEYE_OVLnew / K4 l1 ]$ p7 x* P0 H
……6 |% A: m1 b- D
……- J( e- A0 Z& \6 F5 \1 Y" C
4、运行该bat文件,逆转换* C7 c( r) E) y+ l6 P
8 A/ B9 Z2 V# |6 [附件包里添加逆转换工具convertback.exe,压缩解压缩工具nancylzss.exe
2 `) J1 X0 j+ I! D
; i4 o3 y/ P5 z) l9 _) sok,下一步进行关键的图片文本导入测试~ |