先挖个坑,慢慢填 o- C1 T, W( Z. k! u; r9 A. {; H# k
, O! B( S' R( s4 |) l: _% @( C
计划包含两个工具
; p2 c- u. F0 o其一,cif文件——解压缩——转换成bmp图
" q: O/ v+ H/ R9 _! l, m$ s3 o" i其二,bmp图——逆转换——压缩成cif文件, A/ B; h. K, u6 y$ l
/ A8 P' ?6 l" D+ i- B- \* [9 A第一个应该要实现批量转换,就是读取Ciftree.dat头部文件表,然后将所有图片文件解压缩,转换
' _8 D$ L3 W" ]" h5 I第二个只需要单张处理就行了,毕竟相对于原来的大量图片,需要PS的只是很少的部分
. _3 _) b" F. f5 K) _
2 _0 A& b7 r9 {+ W9 t————————————————————————————————————————————
$ p2 ~) i+ O5 y' [ND16、17图片文件格式详解:5 C+ @2 v; `: x! I
! P- r/ f9 v' b首先判断是不是图片,可以在Ciftree.dat的头部文件表里文件名后14个字节的地方看看有没有数据,此处存放是图片宽高像素,各4个字节,基本上两个数据都不等于0就是图片了
+ R; T. s- _3 w# |% @9 t
& J3 ?3 ? ^* {! |5 u图片文件在lzss解压缩后数据结构是 文件头+bmp图像RGB数据
' |+ n4 e4 b# v3 ?- `
* L5 p" w. g8 K2 |; L9 W/ U其中,图片有两种格式,一种是32位图像,一种是24位图像$ y( x+ M+ z; N) t5 y! L
前者的文件头长度是18个字节,后者的文件头长度是31个字节(其中还有字串“Contains”)<—(有误,见下面更新)
7 C* [0 L8 X9 o# w' `( w# L: {- e) Q- V' @- \5 O; a9 O' b8 o$ Q
具体判断方式是 宽像素*高像素*4和文件大小比较
8 Q* ?6 i. K# L3 P% ~% R+ }8 a如果是32位图像,则文件大小比上述计算所得值大18个字节' `( O9 H g M- X- c: }6 @4 \ {' q7 G
如果是24位图像,则文件大小比上述计算值小,应该是等于 宽*高*3+317 e9 |0 E" R3 \( L
+ l) y7 X4 n7 M( T9 @: {文件头之后就是图片的RGB数据,32位图像是4个字节表示一个像素,而24位图像是3个字节表示一个像素,这也就是为什么上面要乘3、4的原因。
$ F, b' o6 U' \3 q8 e
: F5 }; D: T, o9 u9 e w& v转换工作,32位图像很简单,去掉那18个字节的文件头,然后填上32位BMP图像的文件头就可以了,BMP图像文件头数据比较简单,网上资料很多,这里就不详述了。2 [8 v4 ]6 f. w8 ^: h# H2 v
% H5 S; v/ l/ i" x5 v( o
24位图像转换要稍微麻烦点,因为24位bmp图片在显示时,如果每一行字节数不是4的倍数,就需要补足字节,举个例子,39*33的图片,每行的字节数是39*3=117,不是4的倍数,因此每一行都要补3个字节。同时文件大小和RGB数据大小也改变了,在写文件头的时候也要注意。1 c+ g% O' C7 s" Q3 A2 c2 b9 t6 w) z
, E, P; @" Z f
需要注意的是,存放的RGB数据是逆向的,如果直接复制,转换出来的图片就是倒着的,所以要先读取最后一行的RGB数据,然后从后往前读,最后输出的才是正向的图片。
& K' h& A; Y! I2 A
0 f) w6 R Q* y- s
# g8 N7 `5 Q9 V. j, Y至于逆转换,就是上面说的那些倒过来做一遍,不多说了。" |* ~+ Y# L1 `% N- K O
% Y6 v8 V$ }9 h( j: w( J
——————————————————————————————————————————
$ i9 b6 k. Z. m3 p) x/ q2 o: M6 n以上是理论部分,至于实践部分,目前完成了单张图片的正向转换工具8 S0 w" I$ t- v4 p
- W8 f0 }6 m& P
使用方法:3 @( Q& `' m4 f. l
把待转换的文件和head文件和工具放在一起,命令提示符下convert filename,程序就会自动找出head里对应的文件,读取宽高像素,解压缩,转换。1 U% I5 v3 c8 S
: u4 A) {1 [3 S) N6 O
附件包里包括了工具、head文件、一个待转换文件、一个我写完命令的bat文件,有兴趣的童鞋可以下下来解压,直接运行那个.bat,如果正常的话,你可以在目录下找到一个lzss解压缩后的文件和一张转换完成的图片。
0 C* i: m. q; J# K1 A, T9 a
3 V8 r6 v7 c/ e% P——————————————————————————————————————————
/ l9 m7 M0 Z5 l# T% B+ u( e& [' \' e4 R" Z2 v7 _ j
其实呢,本来批量转换的代码都写好了,但是由于原来的lzss解压工具无法重复运行,批量转换工具暂时难产了。' }2 o8 V, m5 k1 j+ H% Q$ i
就是说我将那解压缩代码添到工具里后,重复执行解压缩程序后,只有第一次能正常解压,后来解压缩出来的文件数据都是错掉的。
& W6 X- V& N( d8 D
" j4 O( Z |! p) S. ]最简单的如下代码也只有file1能够正常解压,file3解压出来的数据有错误
6 G: d; S, e& `) `$ n! Y) I9 M% jmain(){
; D. u) R. U: h. n! Nlzss(2,file1,file2); // 2代表解压,前一个文件是源文件,后者是解压后生成文件4 M y% [3 e2 S: n
lzss(2,file3,file4);1 E9 U! r2 F& e0 M) q+ o
}7 I4 t, ^ ^- N
X- O8 ]+ H( V& p$ V可能是我添代码的时候出了问题,也可能是原来解压程序的代码有问题,运行完部分数据没有初始化。正在研究中.....
" K' I, H8 ?8 l1 w: h# ^
3 D+ c' v* O; z% B+ U' K未完待续....
1 n: R }' j' w7 [! K) @- }——————————————————————————————————————————5 E% m) K8 R4 F" N. E U& [
09.09.16更新4 O4 \0 E' x7 D6 j
6 `; f; w: S7 F* N- V昨晚睡觉时突然想到,批量转换其实也可以用批处理.bat文件完成,这样就不需要再编程了9 G: K+ O1 B8 }5 g# r7 i- `) f7 p1 y
当然效率会比编好的程序低一点,不过一个小工具,问题不大。
- f" K$ c6 {3 X具体就是建立一个.bat文件,依次输入:
6 V ?$ Y: B# g& G( m3 y; S. J, z# H$ c t3 i
convert BRU_DESKBOOK_OVL7 E* u: M4 ~! q
convert BRU_DESKEYE_OVL( t0 p; z2 ?4 i9 ?6 ]- O0 F8 W- o
convert BRU_EYEGRIDOPEN01_OVL+ f" b7 X* Z5 p: p
convert BRU_EYEGRIDOPEN02_OVL: y! u+ P& N0 J" _/ ]
……
9 o* H0 m6 [0 @8 P9 {& d$ f……
3 g7 u4 y& O. k+ \2 j! u& Q- C
. C) [" B* E }9 T1 X/ S5 {0 b就行了,当然,几百张图片不可能手输,几行代码就可以搞定了,附件包里增加一个convert17.bat
3 A4 F' l! m1 E6 [; ~, i7 z: z0 F就是ND17所有图片文件的批处理文件。
) x! G- @: U& T5 p/ b/ G1 E使用方法就是把convert17.bat和convert.exe还有解包后的那一堆文件放在一起,运行.bat文件就行了。) `4 v& w" Q& y( m
# \7 T- O' E/ l4 @: @ok,下一步开始制作逆转换工具# @% k6 N' Q; \8 K& J
————————————————————————————————————————————" ~5 _$ O+ m+ W: _# b0 Z
09.09.19更新. h$ ]! Z1 g: j; L; G- ~- ]7 D( R* I
终于熬到双休日了,真是痛苦的一周╮(╯_╰)╭
+ l2 B0 G G) b; W. r
/ Y; S* m5 _6 j+ q4 b首先,对上面文件格式分析的一个勘误,并非所有24位图像的文件头都是31个字节
* ` Q* Q# h1 ^也有一部分的文件头是18个字节,具体什么情况出现31个字节文件头尚不清楚,可以知道的是31个字节文件头中含有字串“Contains”,辨别文件头有几个字节可以直接 文件size-宽*高*3 计算而得
/ i( o* C- \$ ~" X
! i# ~4 k5 @9 T5 r) m其次,更新逆转换工具5 C0 A8 l/ b! v
使用方法:将工具和转换后的bmp图像,正转换过程中生成的.pic文件(就是cif文件解压缩所得,用来提取文件头)放在一起,命令提示符下输入convertback FILENAME即可,FILENAME无需后缀名,例如像转换工具一样只需输入convertback BRU_DESKBOOK_OVL即可
7 ~) l3 I D) n2 s) K8 D: x
) Y0 u4 O5 B/ m. ^; W' @因为之前加入lzss代码出现了例如不能重复运行等种种问题,所以逆转换工具暂时不添加lzss压缩的代码。就是说转换后的还是pic文件(FILENAMEnew.pic),需要另外运行南希lzss解压缩工具nancylzss.exe。" B6 C! @2 c" z2 k( c" `
具体使用时还是可以用bat文件来达到批量操作。
: C$ V( h8 s) y* {7 Q2 E
* d j; H/ v- b: }0 K D图片汉化流程:
- C/ ^" {* [: d3 ?4 L1 V
) V: G6 j* O T6 K1、用convert17.bat转换所有图片文件
: U/ ^8 b9 z, L% Z4 O2、查看所有图片,找出、PS需要修改的图片, ?. W+ S( ?- d
3、建立一个convertback.bat,依次输入需要转换的图片,例如:
/ f2 j1 @: M0 x+ |& U convert BRU_DESKBOOK_OVL9 d3 s4 j* T) l
nancylzss e BRU_DESKBOOK_OVLnew.pic BRU_DESKBOOK_OVLnew
! x3 O5 K- Q! g& F Y" S convert BRU_DESKEYE_OVL% Q" n0 o2 A/ J! V5 F
nancylzss e BRU_DESKEYE_OVLnew.pic BRU_DESKEYE_OVLnew
& `8 p G) S" A' B' n ……
3 V" o, _0 F9 n ……2 q" q9 A% j- D* s- Z) c" o
4、运行该bat文件,逆转换& k6 v; S% G: i( q: V
3 \( }9 |7 G1 B# B/ ^- I# {; ~
附件包里添加逆转换工具convertback.exe,压缩解压缩工具nancylzss.exe
1 B" } |- d" Z! w
: K: D5 e ?7 s- E% }9 Bok,下一步进行关键的图片文本导入测试~ |