先挖个坑,慢慢填' O6 `4 a# H0 o2 D( g i
5 ^$ V3 \( j5 \5 r( u计划包含两个工具
7 k" x/ g" C% j' O其一,cif文件——解压缩——转换成bmp图
- x4 g% m5 T) _. V7 t% C3 I; c其二,bmp图——逆转换——压缩成cif文件
1 E( A+ e. I* R4 g1 F5 h" m) m0 a6 \4 U
第一个应该要实现批量转换,就是读取Ciftree.dat头部文件表,然后将所有图片文件解压缩,转换
) i% d" w3 q( j- g" h# O1 q第二个只需要单张处理就行了,毕竟相对于原来的大量图片,需要PS的只是很少的部分
) ]' M9 _7 z: [# d
8 T. Y. d9 a, T————————————————————————————————————————————5 m8 g9 k2 p3 q5 x, A) o: l- A* K, h
ND16、17图片文件格式详解:
% w1 t/ B1 N3 S4 ?0 y4 Y8 I
# C- A9 y9 t# _首先判断是不是图片,可以在Ciftree.dat的头部文件表里文件名后14个字节的地方看看有没有数据,此处存放是图片宽高像素,各4个字节,基本上两个数据都不等于0就是图片了
8 f! l5 z6 {- D+ J& H7 r" I* ?4 W. L% l9 W2 m' z8 Y
图片文件在lzss解压缩后数据结构是 文件头+bmp图像RGB数据) [0 I) |& d% j1 o& s
5 g/ L$ l% M. g9 y3 v( F8 y其中,图片有两种格式,一种是32位图像,一种是24位图像) W9 Z% {$ Z* h0 R
前者的文件头长度是18个字节,后者的文件头长度是31个字节(其中还有字串“Contains”)<—(有误,见下面更新)
, ?* [: W! G) @4 z2 k
9 O8 I" T! ?+ R- p$ M$ o4 v: G具体判断方式是 宽像素*高像素*4和文件大小比较
% ^* V: t7 Q: o* A/ O" }如果是32位图像,则文件大小比上述计算所得值大18个字节/ S! e! F' w. X" f
如果是24位图像,则文件大小比上述计算值小,应该是等于 宽*高*3+31$ ?3 D7 A1 `/ q: S9 R. ^
+ T* V- a! Z* y7 R4 K6 m文件头之后就是图片的RGB数据,32位图像是4个字节表示一个像素,而24位图像是3个字节表示一个像素,这也就是为什么上面要乘3、4的原因。& Z, V2 d/ @% R/ V4 K) z; c- t7 V
, x* V* i/ {& L. s转换工作,32位图像很简单,去掉那18个字节的文件头,然后填上32位BMP图像的文件头就可以了,BMP图像文件头数据比较简单,网上资料很多,这里就不详述了。
: |" F+ Y7 |1 a/ o9 ]/ E% s. \6 h6 q7 c- _ e
24位图像转换要稍微麻烦点,因为24位bmp图片在显示时,如果每一行字节数不是4的倍数,就需要补足字节,举个例子,39*33的图片,每行的字节数是39*3=117,不是4的倍数,因此每一行都要补3个字节。同时文件大小和RGB数据大小也改变了,在写文件头的时候也要注意。
+ i0 X* x" }8 L9 _& r) _; v+ i" z
" }, W" k6 Q5 A6 D$ t需要注意的是,存放的RGB数据是逆向的,如果直接复制,转换出来的图片就是倒着的,所以要先读取最后一行的RGB数据,然后从后往前读,最后输出的才是正向的图片。
6 ~2 D: i% l& z. M! `
, i8 N( w% H, I' Y$ }( t% |( e% G1 Q% X6 Q0 Y. q+ `
至于逆转换,就是上面说的那些倒过来做一遍,不多说了。8 i2 |$ A: I% A# I
7 c$ J U) ?- G+ V# k3 X——————————————————————————————————————————
; A( m9 I! g5 b1 K以上是理论部分,至于实践部分,目前完成了单张图片的正向转换工具" Y2 T Z6 t) v* E- c) Q7 p
& ~3 a; x1 r/ ?6 i
使用方法:
a: w9 z' X# u0 \$ v4 x 把待转换的文件和head文件和工具放在一起,命令提示符下convert filename,程序就会自动找出head里对应的文件,读取宽高像素,解压缩,转换。- @4 X$ T2 m y/ `1 a9 X% `0 ~
/ J0 A/ A1 ], i9 t& S& q2 [2 \) i附件包里包括了工具、head文件、一个待转换文件、一个我写完命令的bat文件,有兴趣的童鞋可以下下来解压,直接运行那个.bat,如果正常的话,你可以在目录下找到一个lzss解压缩后的文件和一张转换完成的图片。4 F7 r$ q) ^3 ^- y% P
' i6 h+ u8 b: V
——————————————————————————————————————————
9 X% f8 z! i& T m7 ^
1 H1 f# ^" c' A7 o$ x4 }其实呢,本来批量转换的代码都写好了,但是由于原来的lzss解压工具无法重复运行,批量转换工具暂时难产了。# _: l2 V m6 d
就是说我将那解压缩代码添到工具里后,重复执行解压缩程序后,只有第一次能正常解压,后来解压缩出来的文件数据都是错掉的。
! b# j, ]! g$ H5 ]' n* _
. @; U* I) ~0 i0 s最简单的如下代码也只有file1能够正常解压,file3解压出来的数据有错误
. D" n# T2 U4 L; t9 r# b3 qmain(){0 ~/ O0 s: [: p1 U% x5 a9 Q
lzss(2,file1,file2); // 2代表解压,前一个文件是源文件,后者是解压后生成文件
" C, p( F, n7 a9 a& b) Dlzss(2,file3,file4);
& F1 m7 x( A& X1 o}
7 P( E2 |2 H' i" r( M$ |7 t
7 [% j+ Q/ `# O2 Z# {7 B. b! \可能是我添代码的时候出了问题,也可能是原来解压程序的代码有问题,运行完部分数据没有初始化。正在研究中.....
( V! o8 j( x1 U* M) }8 G$ }0 u) H9 A4 @) t
未完待续....
+ ~- s* q w7 |——————————————————————————————————————————' \* |: q0 [( g, t! p3 X
09.09.16更新
1 Z% d5 e2 I! e% Y( N: `. s5 @ D' m
昨晚睡觉时突然想到,批量转换其实也可以用批处理.bat文件完成,这样就不需要再编程了
5 C4 Y: X; n4 j$ c3 t: S( I当然效率会比编好的程序低一点,不过一个小工具,问题不大。0 c; Z5 s5 o( {, ]0 D$ A3 [4 U' `
具体就是建立一个.bat文件,依次输入:
+ n2 \* {& j# _% s# b) L: d2 L
3 ^, `; l$ l1 V% G2 r& {; L6 vconvert BRU_DESKBOOK_OVL
1 d, ]# x, t( M' aconvert BRU_DESKEYE_OVL
6 Z# i5 j. \# t- n1 p$ }. \convert BRU_EYEGRIDOPEN01_OVL+ O/ w; s: o, b4 w. t. x
convert BRU_EYEGRIDOPEN02_OVL
/ o4 O# O0 F: d' h. R4 L……/ Q* ]+ V5 L. z; @. h
……1 N( Y! Q1 j9 _' f
2 W, t4 [$ A+ q( w' e2 }( B
就行了,当然,几百张图片不可能手输,几行代码就可以搞定了,附件包里增加一个convert17.bat
& L0 o* f, f0 r, B; s就是ND17所有图片文件的批处理文件。
- J5 y; v6 M3 t+ O使用方法就是把convert17.bat和convert.exe还有解包后的那一堆文件放在一起,运行.bat文件就行了。7 k5 ]* |# I! o5 h
\$ C& a. x; D8 k' {
ok,下一步开始制作逆转换工具: |; n. X7 j- Z& r% H$ z
————————————————————————————————————————————6 n" \5 {7 z) j1 t3 a& k) @
09.09.19更新( m0 i) p% n2 B
终于熬到双休日了,真是痛苦的一周╮(╯_╰)╭" |% Z2 U! Q7 i/ n1 [5 y9 X
8 p5 N4 E& N1 N0 q4 N+ [( `: w& ?) b首先,对上面文件格式分析的一个勘误,并非所有24位图像的文件头都是31个字节1 j* h, C J% P N% y2 z& ]# G, \. `
也有一部分的文件头是18个字节,具体什么情况出现31个字节文件头尚不清楚,可以知道的是31个字节文件头中含有字串“Contains”,辨别文件头有几个字节可以直接 文件size-宽*高*3 计算而得" H7 |1 B' M1 X3 w
% y5 j$ N0 D1 S+ F# }
其次,更新逆转换工具; d. l$ Z- o5 A
使用方法:将工具和转换后的bmp图像,正转换过程中生成的.pic文件(就是cif文件解压缩所得,用来提取文件头)放在一起,命令提示符下输入convertback FILENAME即可,FILENAME无需后缀名,例如像转换工具一样只需输入convertback BRU_DESKBOOK_OVL即可
: ?; [8 s6 e" d* p
0 R' h2 \2 g! D5 C- H9 p9 n7 p- L因为之前加入lzss代码出现了例如不能重复运行等种种问题,所以逆转换工具暂时不添加lzss压缩的代码。就是说转换后的还是pic文件(FILENAMEnew.pic),需要另外运行南希lzss解压缩工具nancylzss.exe。' C. ~. H9 i5 l0 n) x0 R
具体使用时还是可以用bat文件来达到批量操作。
p2 G X, O7 x$ [- q: h2 T) J
图片汉化流程:# D7 [! [" J" w7 f2 _
/ R5 ]# z0 e; e j3 _/ u
1、用convert17.bat转换所有图片文件! r. g- D, m ` \+ {: y, v" S; G
2、查看所有图片,找出、PS需要修改的图片5 A; l+ h$ W0 ~. g4 I7 P
3、建立一个convertback.bat,依次输入需要转换的图片,例如:
1 [& T8 E- w6 H2 k1 m9 V: j* ] convert BRU_DESKBOOK_OVL
" Z5 k+ t$ M9 z' ~ nancylzss e BRU_DESKBOOK_OVLnew.pic BRU_DESKBOOK_OVLnew
: \" C1 p# F Y2 M convert BRU_DESKEYE_OVL
8 Y' ~, ~3 Y; F: O$ d d nancylzss e BRU_DESKEYE_OVLnew.pic BRU_DESKEYE_OVLnew + d1 ~( d, \7 s' y
……: B$ T0 T4 P; T3 R0 ~* N
……5 h1 \( V' k3 @# e3 _- X, L
4、运行该bat文件,逆转换$ H; C$ s% ~! o. A1 [: L v2 R
- }4 r2 U' o) C# x附件包里添加逆转换工具convertback.exe,压缩解压缩工具nancylzss.exe
; c5 n' A& ` j: O) q' P: L3 O" H: g/ w( A5 p& d5 `
ok,下一步进行关键的图片文本导入测试~ |