冒险解谜游戏中文网 ChinaAVG

标题: ND16、17图片转换工具 [打印本页]

作者: 深绿    时间: 2009-9-15 22:29
标题: ND16、17图片转换工具
先挖个坑,慢慢填
8 |2 U/ _" {  b( Q8 p, e+ B7 p1 K* |
/ G! Q, l3 f9 D2 C: h计划包含两个工具
' q# s% z7 c8 |其一,cif文件——解压缩——转换成bmp图
! j4 B0 m$ g# ]+ r其二,bmp图——逆转换——压缩成cif文件( C, u: H# |8 g. q& H" x& A1 A5 T
, q0 J* G5 W$ }: w) V
第一个应该要实现批量转换,就是读取Ciftree.dat头部文件表,然后将所有图片文件解压缩,转换
6 O8 d0 m+ Z$ t第二个只需要单张处理就行了,毕竟相对于原来的大量图片,需要PS的只是很少的部分
, A' z" M2 N5 K! B. l2 C6 R; K
" i6 p6 I2 G8 k7 L! m9 }————————————————————————————————————————————5 e+ `! ^: R# c
ND16、17图片文件格式详解:0 `% B$ `8 }# h2 m& t! O& L' t7 g
$ k! t+ z5 P% x  j, Y
首先判断是不是图片,可以在Ciftree.dat的头部文件表里文件名后14个字节的地方看看有没有数据,此处存放是图片宽高像素,各4个字节,基本上两个数据都不等于0就是图片了9 c4 t0 a/ F3 X3 s, s

  Y& P: L: M" }6 l* d% f图片文件在lzss解压缩后数据结构是 文件头+bmp图像RGB数据
' S+ f0 ~' `$ i; L  l. Y7 Y7 {5 g( u* o& o8 I4 `5 `4 t4 @7 \
其中,图片有两种格式,一种是32位图像,一种是24位图像
% V% ]4 t" P) [+ Y, ^* ]" b2 o8 ^" C前者的文件头长度是18个字节,后者的文件头长度是31个字节(其中还有字串“Contains”)<—(有误,见下面更新)
  k3 ~4 a7 [& V/ ]) H9 y9 g- a: f+ N' ?# V9 d
具体判断方式是 宽像素*高像素*4和文件大小比较9 N& ]- o4 R- i7 L( n0 W7 {2 d
如果是32位图像,则文件大小比上述计算所得值大18个字节% G. e) I& B* p- [
如果是24位图像,则文件大小比上述计算值小,应该是等于 宽*高*3+317 ~  N8 Y8 a3 E1 c9 M2 S' z0 }+ B
& `. H8 @8 X8 N/ e4 }  C2 p
文件头之后就是图片的RGB数据,32位图像是4个字节表示一个像素,而24位图像是3个字节表示一个像素,这也就是为什么上面要乘3、4的原因。5 e3 k8 R# [2 b9 |* P; o( C3 J
5 D# m9 P9 a2 [5 f& o
转换工作,32位图像很简单,去掉那18个字节的文件头,然后填上32位BMP图像的文件头就可以了,BMP图像文件头数据比较简单,网上资料很多,这里就不详述了。
4 D+ P. O! q- r; S+ ]& ?- C7 c. y" A& a+ z% q* s) i0 c
24位图像转换要稍微麻烦点,因为24位bmp图片在显示时,如果每一行字节数不是4的倍数,就需要补足字节,举个例子,39*33的图片,每行的字节数是39*3=117,不是4的倍数,因此每一行都要补3个字节。同时文件大小和RGB数据大小也改变了,在写文件头的时候也要注意。
9 u. x% }# x% _. C9 [9 _. x
9 o& q, \9 h. _7 p- d( ~' w" B需要注意的是,存放的RGB数据是逆向的,如果直接复制,转换出来的图片就是倒着的,所以要先读取最后一行的RGB数据,然后从后往前读,最后输出的才是正向的图片。
0 F! C, D3 F6 w: w0 J9 E
* Q7 w0 K8 C* k  U, V! M( ?- o- O$ @
至于逆转换,就是上面说的那些倒过来做一遍,不多说了。  Z/ J, C( ^% s( P/ c/ x: r  x
0 \/ s1 Q* [' M" [! a9 n6 z
——————————————————————————————————————————1 B8 x. Y; j& j  S
以上是理论部分,至于实践部分,目前完成了单张图片的正向转换工具
2 u0 \/ W0 t# [0 U7 R- [8 N. a( L8 b/ d, ^
使用方法:
- U3 f( D& f5 v- s: K% ^* P6 P    把待转换的文件和head文件和工具放在一起,命令提示符下convert filename,程序就会自动找出head里对应的文件,读取宽高像素,解压缩,转换。
- b0 m2 |/ C% z$ |+ S3 A4 a( F! y  C1 k: _) n, \% Y
附件包里包括了工具、head文件、一个待转换文件、一个我写完命令的bat文件,有兴趣的童鞋可以下下来解压,直接运行那个.bat,如果正常的话,你可以在目录下找到一个lzss解压缩后的文件和一张转换完成的图片。0 H/ y* r' w5 @% ^

- g* |, o9 [+ I7 [# ]——————————————————————————————————————————
( x( b8 C& ]$ C: p3 U0 ^3 J9 U' s4 n4 e' B$ [" O4 X0 w
其实呢,本来批量转换的代码都写好了,但是由于原来的lzss解压工具无法重复运行,批量转换工具暂时难产了。
+ F& [, M7 ~" _* ~' l就是说我将那解压缩代码添到工具里后,重复执行解压缩程序后,只有第一次能正常解压,后来解压缩出来的文件数据都是错掉的。4 X# }7 j- s7 U2 V/ `* i
( s( o; S+ t4 K) O  [
最简单的如下代码也只有file1能够正常解压,file3解压出来的数据有错误
5 g5 ^3 f1 v6 R7 {. r8 ]( v8 n0 Hmain(){8 c: ]- a- B& j. ~7 \
lzss(2,file1,file2);   //  2代表解压,前一个文件是源文件,后者是解压后生成文件
; f/ D; `1 U' W) _. _  ?) Ilzss(2,file3,file4);
2 y" i2 i7 u7 A2 B# t, i}
! R; E8 o  a2 o* z" A( i8 f0 [# w9 |" w* ?5 `9 p
可能是我添代码的时候出了问题,也可能是原来解压程序的代码有问题,运行完部分数据没有初始化。正在研究中.....
& }& R; l& Q, r& G+ Z3 h- m; R; G- Q, q* X- a: f+ P
未完待续....0 e+ Y5 h$ Z* `' R! {9 n
——————————————————————————————————————————
" ]' u- K7 P. ~& Z/ }09.09.16更新
- e( o' g' Q# W- Q& P2 m+ d$ c0 s4 n0 d  h( D" q; V8 R
昨晚睡觉时突然想到,批量转换其实也可以用批处理.bat文件完成,这样就不需要再编程了
! C8 R. S4 u0 G- j当然效率会比编好的程序低一点,不过一个小工具,问题不大。8 ]& N+ G# R; t! |0 l: [' _
具体就是建立一个.bat文件,依次输入:4 ~* x& u1 v$ n& g0 S" V3 b$ e; B

% R9 i$ ~1 |# W' rconvert BRU_DESKBOOK_OVL) q' R+ K$ V% t: t3 o2 A
convert BRU_DESKEYE_OVL% [) X" D& {6 e+ I2 @  z
convert BRU_EYEGRIDOPEN01_OVL
0 z) w: T8 Q; z/ @2 @% rconvert BRU_EYEGRIDOPEN02_OVL8 i7 X% M( _/ X; ?9 e" h0 i/ E, g
……
" a  t4 _+ a+ I- Q8 s! X5 ]……/ e4 g' Q6 b" m! G9 I: ^* E

" }" x" X/ H6 e. @1 n" |就行了,当然,几百张图片不可能手输,几行代码就可以搞定了,附件包里增加一个convert17.bat2 |  K6 F, Q* n& b
就是ND17所有图片文件的批处理文件。# X  E  R1 s- l6 M
使用方法就是把convert17.bat和convert.exe还有解包后的那一堆文件放在一起,运行.bat文件就行了。
4 t3 j2 e% X! i4 Z1 U6 B' C
; G0 e9 P% d3 n% a# G4 B/ `ok,下一步开始制作逆转换工具
7 B( E: K  M. b3 {————————————————————————————————————————————
% ?3 x& N6 t% M8 c  E. u) V09.09.19更新
2 z) e* t( w0 h: m+ O终于熬到双休日了,真是痛苦的一周╮(╯_╰)╭
3 G3 C8 R1 v0 y
/ x5 }  g! i- g首先,对上面文件格式分析的一个勘误,并非所有24位图像的文件头都是31个字节! F5 u8 ?# s# M3 v+ z7 J
也有一部分的文件头是18个字节,具体什么情况出现31个字节文件头尚不清楚,可以知道的是31个字节文件头中含有字串“Contains”,辨别文件头有几个字节可以直接 文件size-宽*高*3  计算而得
5 n  }3 T4 ~( @. j2 ]' N5 c4 t' {7 D" h% e  [
其次,更新逆转换工具
  t2 |; {) j1 t  T使用方法:将工具和转换后的bmp图像,正转换过程中生成的.pic文件(就是cif文件解压缩所得,用来提取文件头)放在一起,命令提示符下输入convertback FILENAME即可,FILENAME无需后缀名,例如像转换工具一样只需输入convertback BRU_DESKBOOK_OVL即可
9 @2 Z/ u5 S  d$ {" j0 O5 Z; r; Y4 Y' s& M& e# ]
因为之前加入lzss代码出现了例如不能重复运行等种种问题,所以逆转换工具暂时不添加lzss压缩的代码。就是说转换后的还是pic文件(FILENAMEnew.pic),需要另外运行南希lzss解压缩工具nancylzss.exe。0 i5 A# ?# `1 b  {" a2 ~% D- u
具体使用时还是可以用bat文件来达到批量操作。2 Q/ C8 q8 b9 a7 Y; W
! _9 a8 h0 o* L  i) ?& j5 \
图片汉化流程:/ Z, ]; h$ T3 B: D' K+ U

5 ]% f" h+ Z/ z  N! Q1、用convert17.bat转换所有图片文件
- P; Q% j0 X0 B  E6 @& C2、查看所有图片,找出、PS需要修改的图片
2 N7 ]5 F' S7 }( x. A3、建立一个convertback.bat,依次输入需要转换的图片,例如:
( j. x& |) z. `4 f5 |+ K* h   convert BRU_DESKBOOK_OVL
: ]  A+ W0 C* f0 M0 z      nancylzss e BRU_DESKBOOK_OVLnew.pic BRU_DESKBOOK_OVLnew
4 G3 G: j4 L4 ~6 U3 G8 k! Z      convert BRU_DESKEYE_OVL
9 k1 H6 @' i* |- ]! b' z      nancylzss e BRU_DESKEYE_OVLnew.pic BRU_DESKEYE_OVLnew 8 x! c. C6 n& B/ ~  Y
      ……& U$ Q3 r3 `/ q+ v' {5 B
   ……0 x# A, A' l' a! R, |+ _8 @1 `
4、运行该bat文件,逆转换
3 x0 X4 l5 B- H/ g% _5 @% F. k  P- o6 f$ \, A4 r3 ^9 ]
附件包里添加逆转换工具convertback.exe,压缩解压缩工具nancylzss.exe6 ~/ ~3 s- b- K0 @) I
% Y8 p5 U- o9 [& c( L0 S
ok,下一步进行关键的图片文本导入测试~
作者: shane007    时间: 2009-9-15 22:31
收到,太感谢了。等我有时间了慢慢看。
作者: shane007    时间: 2009-9-15 22:36
对了,文本部分的导入试验有时间的话请继续。# H; h( X+ \  h* B( F! O
这样又能多2个可汉化游戏。
作者: 深绿    时间: 2009-9-16 18:06
09.09.16更新
作者: shane007    时间: 2009-9-16 20:35
生成bat文件,是个不错的方法。
作者: 深绿    时间: 2009-9-20 00:54
09.09.19更新
作者: shane007    时间: 2009-9-20 08:18
进展不错啊!




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2