先挖个坑,慢慢填8 z h6 @8 U2 y% y7 G# z
: e/ Z; @ c, F2 I计划包含两个工具
' S$ {$ H- F7 \, u& B. Z7 \其一,cif文件——解压缩——转换成bmp图8 J" s& p, Q: r. S
其二,bmp图——逆转换——压缩成cif文件
j# w0 q# S' j2 C8 w" L) i
+ s) `2 \0 H$ S第一个应该要实现批量转换,就是读取Ciftree.dat头部文件表,然后将所有图片文件解压缩,转换
- P6 O& h2 K% d, V! i: K- t第二个只需要单张处理就行了,毕竟相对于原来的大量图片,需要PS的只是很少的部分: m! l, I$ S( r" F/ d/ {% X" q
* n' G" ~( p6 i: U! ^ S+ s————————————————————————————————————————————
$ E6 {2 s2 l1 `! aND16、17图片文件格式详解:% Z7 }+ j1 {9 ~1 { z
J7 U* j' }* m" A. ]* L
首先判断是不是图片,可以在Ciftree.dat的头部文件表里文件名后14个字节的地方看看有没有数据,此处存放是图片宽高像素,各4个字节,基本上两个数据都不等于0就是图片了
3 T, X' R( ]! F" G" G
0 m4 w! r- F, {图片文件在lzss解压缩后数据结构是 文件头+bmp图像RGB数据! [9 I3 m, Z- x5 b' N
1 f; m0 a/ Q& l. t其中,图片有两种格式,一种是32位图像,一种是24位图像
7 ~- c( S# @* n) Q, |; P ?2 @( w前者的文件头长度是18个字节,后者的文件头长度是31个字节(其中还有字串“Contains”)<—(有误,见下面更新)
& D, R+ ?! X: P) \( a* l! F
' ]- o2 N: }# M8 ~+ J/ c/ P具体判断方式是 宽像素*高像素*4和文件大小比较
% O3 @& D$ Q! B8 l如果是32位图像,则文件大小比上述计算所得值大18个字节
' N* M# H% B; y如果是24位图像,则文件大小比上述计算值小,应该是等于 宽*高*3+310 d/ C N) ]# P: z8 @5 {, ]% ?
4 y" N6 p7 M Z6 M. i2 l文件头之后就是图片的RGB数据,32位图像是4个字节表示一个像素,而24位图像是3个字节表示一个像素,这也就是为什么上面要乘3、4的原因。3 M! M2 R4 j4 R4 h7 V8 d' c# S. |
+ r5 C# R4 x4 a3 w# ?9 D# n4 T
转换工作,32位图像很简单,去掉那18个字节的文件头,然后填上32位BMP图像的文件头就可以了,BMP图像文件头数据比较简单,网上资料很多,这里就不详述了。0 n) e% r# h( Y4 |6 ]) ~3 f) S! B
9 Q8 I/ W( p% G2 ]( G& C
24位图像转换要稍微麻烦点,因为24位bmp图片在显示时,如果每一行字节数不是4的倍数,就需要补足字节,举个例子,39*33的图片,每行的字节数是39*3=117,不是4的倍数,因此每一行都要补3个字节。同时文件大小和RGB数据大小也改变了,在写文件头的时候也要注意。. t% {/ ]) i% |& e, X$ J
% N1 g, P3 o* m需要注意的是,存放的RGB数据是逆向的,如果直接复制,转换出来的图片就是倒着的,所以要先读取最后一行的RGB数据,然后从后往前读,最后输出的才是正向的图片。0 P/ v: _, s9 l3 e( L3 b$ z
@* J* d$ K; h% W: W w- u6 j( v3 [( H& Q
至于逆转换,就是上面说的那些倒过来做一遍,不多说了。" e& C' s: N# B3 Z: v/ q* M- N5 j
# P+ T1 }$ @, o: O8 u/ q$ c
——————————————————————————————————————————
( w7 e; [/ i0 ^9 l' w以上是理论部分,至于实践部分,目前完成了单张图片的正向转换工具3 i6 Z6 h' b6 a
P4 Q: i' g% {% V
使用方法:5 H& R9 ]1 a5 o7 H4 @) d, A
把待转换的文件和head文件和工具放在一起,命令提示符下convert filename,程序就会自动找出head里对应的文件,读取宽高像素,解压缩,转换。
: v# v- u6 v0 v/ \9 }# a
0 _# [3 d+ |# ?7 |& j附件包里包括了工具、head文件、一个待转换文件、一个我写完命令的bat文件,有兴趣的童鞋可以下下来解压,直接运行那个.bat,如果正常的话,你可以在目录下找到一个lzss解压缩后的文件和一张转换完成的图片。
( r% y- s$ {+ j% u, w& j: K4 B* F0 E8 `, e
——————————————————————————————————————————# V+ o# r; M, Y( q6 h! D6 G$ f
, a0 p4 G; I& h7 L& e6 E' k2 ?
其实呢,本来批量转换的代码都写好了,但是由于原来的lzss解压工具无法重复运行,批量转换工具暂时难产了。7 x2 C& [% `7 |: A& ~2 E+ `+ z
就是说我将那解压缩代码添到工具里后,重复执行解压缩程序后,只有第一次能正常解压,后来解压缩出来的文件数据都是错掉的。 P9 O" A, D) i2 Z/ {& `/ i
" K5 a+ N1 q, P# b2 y8 [7 V: Z
最简单的如下代码也只有file1能够正常解压,file3解压出来的数据有错误. E, j. D# m2 q! s- J+ G; V
main(){
6 R% b9 `0 O' x, Olzss(2,file1,file2); // 2代表解压,前一个文件是源文件,后者是解压后生成文件
1 w6 k9 q6 \' Vlzss(2,file3,file4);6 y) i' ]1 @, G
}1 k. m5 |# E2 [# u
7 L- t/ f: k( j7 }2 J' C9 v
可能是我添代码的时候出了问题,也可能是原来解压程序的代码有问题,运行完部分数据没有初始化。正在研究中....." X" F# r6 S, ^6 T# W# a
9 F! o; e- ]. S9 G未完待续....
3 d K' A0 X+ h. F! c1 D——————————————————————————————————————————
1 u# t) }- p2 z09.09.16更新
: I( f3 J6 b+ _, O- S( W; v
: D) q# O: D+ k6 N昨晚睡觉时突然想到,批量转换其实也可以用批处理.bat文件完成,这样就不需要再编程了( E) [3 D0 I/ w7 S7 d' @7 r) w
当然效率会比编好的程序低一点,不过一个小工具,问题不大。* r" \& ^' d$ y5 e6 P' `+ E$ j
具体就是建立一个.bat文件,依次输入:
& y2 l7 c+ {6 w0 E' O5 u" B8 f" J8 F6 {1 Z) V$ }% `& c
convert BRU_DESKBOOK_OVL C7 H z) X$ i4 x+ m
convert BRU_DESKEYE_OVL. j) s+ d# s) T! @8 r6 A
convert BRU_EYEGRIDOPEN01_OVL3 E# O3 T( h3 K* l$ k' ]
convert BRU_EYEGRIDOPEN02_OVL3 w" q( j* T; _) J$ K
……
8 I# ?' _' W# Y- t! S; W……
( W9 w1 q4 w0 B3 D
5 F- o+ j1 n0 F- Z9 H. K" k就行了,当然,几百张图片不可能手输,几行代码就可以搞定了,附件包里增加一个convert17.bat
' z9 V+ V+ a9 C% n% M就是ND17所有图片文件的批处理文件。6 o2 s. p6 l& R& G
使用方法就是把convert17.bat和convert.exe还有解包后的那一堆文件放在一起,运行.bat文件就行了。' V% S f$ V) Q2 w' Z; n
" g7 [- t9 q6 _ {: F$ T wok,下一步开始制作逆转换工具
9 w- f( s# Y1 X, f————————————————————————————————————————————( Z/ M5 h: D4 r: t3 v
09.09.19更新
8 J0 u, B+ C1 d6 A终于熬到双休日了,真是痛苦的一周╮(╯_╰)╭0 B9 q) N+ ~- Y' y3 p( ~6 {& r% H
2 ~$ Q) }9 j0 Q3 u8 A
首先,对上面文件格式分析的一个勘误,并非所有24位图像的文件头都是31个字节
) t9 B; p. }2 k: d/ ]也有一部分的文件头是18个字节,具体什么情况出现31个字节文件头尚不清楚,可以知道的是31个字节文件头中含有字串“Contains”,辨别文件头有几个字节可以直接 文件size-宽*高*3 计算而得' R$ w$ r' ~$ C+ n& R& Q
' `. k. {/ |; ]9 r
其次,更新逆转换工具# U- ^5 B& |$ ^7 ]) c% M! ~
使用方法:将工具和转换后的bmp图像,正转换过程中生成的.pic文件(就是cif文件解压缩所得,用来提取文件头)放在一起,命令提示符下输入convertback FILENAME即可,FILENAME无需后缀名,例如像转换工具一样只需输入convertback BRU_DESKBOOK_OVL即可
3 z8 W* H$ O$ [0 O: w. C# `! L5 r7 W$ q8 P3 {0 y! P
因为之前加入lzss代码出现了例如不能重复运行等种种问题,所以逆转换工具暂时不添加lzss压缩的代码。就是说转换后的还是pic文件(FILENAMEnew.pic),需要另外运行南希lzss解压缩工具nancylzss.exe。6 y# W. B. B; Z. o I
具体使用时还是可以用bat文件来达到批量操作。
5 u1 \- _! u, L, g8 c
3 g. g* a- t |+ J: J& A图片汉化流程:
7 f0 R$ ?9 s$ ]* \5 P, a# Z5 F7 K" F/ j! p
1、用convert17.bat转换所有图片文件
1 Z8 F# O% U8 P! N6 ]2、查看所有图片,找出、PS需要修改的图片& |8 |+ n2 u! P8 [3 _# ^. O' x
3、建立一个convertback.bat,依次输入需要转换的图片,例如:
, Y- g+ G% w( Y) i$ { convert BRU_DESKBOOK_OVL
( e2 j1 ^% H; ? nancylzss e BRU_DESKBOOK_OVLnew.pic BRU_DESKBOOK_OVLnew
# Z5 e$ X- u4 y: y+ t% n convert BRU_DESKEYE_OVL
$ |' b' i: | O6 y6 W4 Q nancylzss e BRU_DESKEYE_OVLnew.pic BRU_DESKEYE_OVLnew
4 s. G- {; {4 Y, K ……
! K Y# u2 w6 M# |, t* L8 c W ……
& f( k1 Z F9 l4 \3 Z4、运行该bat文件,逆转换" u/ C+ B! g4 X L
% M5 v- t% C4 L: X' H, g附件包里添加逆转换工具convertback.exe,压缩解压缩工具nancylzss.exe# s1 {8 J/ o' S f& p
2 n: Y$ E3 Y+ Q# v* t1 Iok,下一步进行关键的图片文本导入测试~ |