先挖个坑,慢慢填3 y& [( G* p- B9 N
; ^1 _, C; w. l' |
计划包含两个工具2 [# D2 B, S9 W" }1 M
其一,cif文件——解压缩——转换成bmp图
u3 h. O5 K0 M% h其二,bmp图——逆转换——压缩成cif文件
" k& K) ]' M+ M* U$ k0 ~: N. W/ b/ x) |- l9 m8 d1 d
第一个应该要实现批量转换,就是读取Ciftree.dat头部文件表,然后将所有图片文件解压缩,转换2 s$ v5 g# n& r/ x! |
第二个只需要单张处理就行了,毕竟相对于原来的大量图片,需要PS的只是很少的部分
4 m) ^1 g5 Z6 H; H* M3 C/ A8 m
1 E8 R O1 J6 w————————————————————————————————————————————
) H. a) d7 I' i1 S1 g {ND16、17图片文件格式详解:$ H/ z3 f. @% ?# K: @3 w
: I0 P: [7 v& S8 I首先判断是不是图片,可以在Ciftree.dat的头部文件表里文件名后14个字节的地方看看有没有数据,此处存放是图片宽高像素,各4个字节,基本上两个数据都不等于0就是图片了& q% C, H5 p3 t9 T9 q: o
% t! r# R, E5 M; f; d
图片文件在lzss解压缩后数据结构是 文件头+bmp图像RGB数据* \5 I h- k# g/ p& x: s8 g
% p o2 H% U" h9 T2 n' r其中,图片有两种格式,一种是32位图像,一种是24位图像
% n, k2 {( ]! o; i3 @3 R! u1 s3 Y, t前者的文件头长度是18个字节,后者的文件头长度是31个字节(其中还有字串“Contains”)<—(有误,见下面更新)5 _3 ~ P R# a- |& N5 e8 f
$ s" h9 _: b+ o2 F6 D
具体判断方式是 宽像素*高像素*4和文件大小比较
, m @) Y$ A6 h如果是32位图像,则文件大小比上述计算所得值大18个字节
) l! E8 P5 G. Z' z7 i如果是24位图像,则文件大小比上述计算值小,应该是等于 宽*高*3+31( q v5 V8 o$ Y: U G' c
, l0 u3 O9 i6 g文件头之后就是图片的RGB数据,32位图像是4个字节表示一个像素,而24位图像是3个字节表示一个像素,这也就是为什么上面要乘3、4的原因。# v2 Z, B8 {4 p& m7 e" E% k
1 J* J, p4 i" R+ V; S: }: ]转换工作,32位图像很简单,去掉那18个字节的文件头,然后填上32位BMP图像的文件头就可以了,BMP图像文件头数据比较简单,网上资料很多,这里就不详述了。
1 J9 D3 J4 E* I6 b" {) c) v
! I! O; F; N9 t% ~& F$ c24位图像转换要稍微麻烦点,因为24位bmp图片在显示时,如果每一行字节数不是4的倍数,就需要补足字节,举个例子,39*33的图片,每行的字节数是39*3=117,不是4的倍数,因此每一行都要补3个字节。同时文件大小和RGB数据大小也改变了,在写文件头的时候也要注意。
7 i6 S2 j# q, }# I
' `1 w5 h2 {/ S& p需要注意的是,存放的RGB数据是逆向的,如果直接复制,转换出来的图片就是倒着的,所以要先读取最后一行的RGB数据,然后从后往前读,最后输出的才是正向的图片。' b* t. ]/ ^+ J, j% I. Y: F! U2 T0 }% a
4 x+ R& A# v) Y( u4 S) v& J
3 R7 D+ _' ?5 F ~7 E- l; R- l
至于逆转换,就是上面说的那些倒过来做一遍,不多说了。) e: |* U) q" ^0 W1 ^
2 R `# w9 \. r2 b0 I; X
——————————————————————————————————————————
' y8 E/ S. \7 z& a" l以上是理论部分,至于实践部分,目前完成了单张图片的正向转换工具
4 I3 v( J+ L% R L) K; U; v: ^ T6 f0 |
使用方法:- v1 o0 _# C4 ?& x
把待转换的文件和head文件和工具放在一起,命令提示符下convert filename,程序就会自动找出head里对应的文件,读取宽高像素,解压缩,转换。
" Q; k9 P: h7 o% ]$ C1 j4 _. R% ^& x& g% a4 |& M8 B4 H$ r
附件包里包括了工具、head文件、一个待转换文件、一个我写完命令的bat文件,有兴趣的童鞋可以下下来解压,直接运行那个.bat,如果正常的话,你可以在目录下找到一个lzss解压缩后的文件和一张转换完成的图片。; d- d7 g' k7 @6 d7 a/ j1 T
2 j8 z; g/ N9 E, |
——————————————————————————————————————————
6 R0 p' r4 U! q. h3 H g0 e$ @+ R$ i& S F; B6 z2 V
其实呢,本来批量转换的代码都写好了,但是由于原来的lzss解压工具无法重复运行,批量转换工具暂时难产了。/ p/ \4 `' t' ~% s( w7 R
就是说我将那解压缩代码添到工具里后,重复执行解压缩程序后,只有第一次能正常解压,后来解压缩出来的文件数据都是错掉的。
0 C6 Y7 H2 @* P8 V4 u, g. \; z' W' D5 ]! L7 z6 h; {
最简单的如下代码也只有file1能够正常解压,file3解压出来的数据有错误1 Z( N# a$ |4 T' s
main(){
% [9 m4 k: g; f# Q! Plzss(2,file1,file2); // 2代表解压,前一个文件是源文件,后者是解压后生成文件' j% s2 I# q( `% ]9 H, g! B
lzss(2,file3,file4);
5 y, e' t" g/ Q% h}
, H" M3 T+ h% H! d7 Y) P3 d3 |) a6 H3 N; ~2 ?) }! W% c
可能是我添代码的时候出了问题,也可能是原来解压程序的代码有问题,运行完部分数据没有初始化。正在研究中.....$ n4 X% n; K+ h5 E9 t
# m0 j. ?5 [9 G$ p C; R
未完待续....
& I. {8 O4 x& y1 ?# ]' y——————————————————————————————————————————
0 ~3 c( j, T, _09.09.16更新/ ^, j9 s. ~% f; p% N, y; f( k$ C
; P- H9 H& ?1 Z昨晚睡觉时突然想到,批量转换其实也可以用批处理.bat文件完成,这样就不需要再编程了. r X- c! }! {2 |+ k
当然效率会比编好的程序低一点,不过一个小工具,问题不大。; t% V4 R. y2 g3 [) l* ?% F' F, K
具体就是建立一个.bat文件,依次输入:5 }' D9 ]: X$ Z# V, Y% l
5 T6 x$ }7 K& L; ^convert BRU_DESKBOOK_OVL! J: u' E) N7 q( i8 S2 c
convert BRU_DESKEYE_OVL; f' U, m/ j7 g- N; j% |
convert BRU_EYEGRIDOPEN01_OVL
+ I2 Y5 _! f- H6 a; a( Lconvert BRU_EYEGRIDOPEN02_OVL
; }" g$ k$ P( }' R- m3 j: w……
: [" X- M, C+ X2 M9 N! d+ U……! a1 z4 f2 a7 C- V* \: J! q
, O* E- u1 x5 x( R就行了,当然,几百张图片不可能手输,几行代码就可以搞定了,附件包里增加一个convert17.bat" l0 u( e$ c) @- r. m' V9 K: P
就是ND17所有图片文件的批处理文件。0 a7 P8 V! R! u
使用方法就是把convert17.bat和convert.exe还有解包后的那一堆文件放在一起,运行.bat文件就行了。. g1 \" {9 L* E8 w" D, @. J9 X
, @' ^; l4 y9 z, x5 Y' P/ E# j* ]
ok,下一步开始制作逆转换工具1 @1 @( c- z6 `4 ?# u$ C9 l6 J. R
————————————————————————————————————————————
, U! v# ], p' T g2 J" S" Q5 t# N: ~09.09.19更新
. ?# e6 M2 `: F) K% j) A7 m终于熬到双休日了,真是痛苦的一周╮(╯_╰)╭7 E6 q9 r8 T( j+ y
& Z- j' G" a" o% H, I6 {$ [首先,对上面文件格式分析的一个勘误,并非所有24位图像的文件头都是31个字节
g1 ?9 I/ J h0 X4 n2 O! O也有一部分的文件头是18个字节,具体什么情况出现31个字节文件头尚不清楚,可以知道的是31个字节文件头中含有字串“Contains”,辨别文件头有几个字节可以直接 文件size-宽*高*3 计算而得: @- c6 W! f0 U C! M! ~5 \7 p
3 Y4 u% V k( P7 y, Q$ E其次,更新逆转换工具
3 L' f( l1 \3 r, T8 s; q0 q5 q+ I& H使用方法:将工具和转换后的bmp图像,正转换过程中生成的.pic文件(就是cif文件解压缩所得,用来提取文件头)放在一起,命令提示符下输入convertback FILENAME即可,FILENAME无需后缀名,例如像转换工具一样只需输入convertback BRU_DESKBOOK_OVL即可& q: c4 W) U% m/ ^7 C2 i
; N! X ~$ ?; R5 j( e6 J" T
因为之前加入lzss代码出现了例如不能重复运行等种种问题,所以逆转换工具暂时不添加lzss压缩的代码。就是说转换后的还是pic文件(FILENAMEnew.pic),需要另外运行南希lzss解压缩工具nancylzss.exe。/ X o/ {7 R+ f( f
具体使用时还是可以用bat文件来达到批量操作。+ g6 @4 g* O0 `$ i: S
; p0 \$ f* K2 f6 X图片汉化流程:
% f0 |, c% }, `( B9 I) B1 a+ J: Y' g N5 a7 g3 C
1、用convert17.bat转换所有图片文件+ o# n; m; c3 s/ V. o7 ]- J3 d0 \
2、查看所有图片,找出、PS需要修改的图片. J6 Y: D Z9 A
3、建立一个convertback.bat,依次输入需要转换的图片,例如:
0 p0 K" s" F( E/ J4 Z. n1 X- a convert BRU_DESKBOOK_OVL" d: z5 _* A, j; Q0 m# B! O4 f
nancylzss e BRU_DESKBOOK_OVLnew.pic BRU_DESKBOOK_OVLnew - L. v9 w. B8 s9 D* J1 f2 w, d# j
convert BRU_DESKEYE_OVL4 @9 B: P: X* x4 `* ]
nancylzss e BRU_DESKEYE_OVLnew.pic BRU_DESKEYE_OVLnew
8 Q J7 a* a. I2 I ……$ g7 \! J" o' R# C2 V& Y" ^
……
i, E; N! a7 D2 }& a0 [# y) j4、运行该bat文件,逆转换
! a0 D. {* u2 i: |0 z. d% a7 o& G, L2 u
附件包里添加逆转换工具convertback.exe,压缩解压缩工具nancylzss.exe
2 E& d: V2 H1 f" P+ w p9 _% g' D" k- m# i
ok,下一步进行关键的图片文本导入测试~ |