「The King of Fighters i 2012」obm格式转换工具

声明:本文采用 BY-NC-SA 协议进行授权。 转载请注明转自:「The King of Fighters i 2012」obm格式转换工具

应tokTc要求,帮忙写一个处理 The King of Fighters i 2012 里面的obm格式转换的程序。

这是第二次接触ios平台的游戏里的自定格式。

obm应该是从bitmap格式发展而来的,由于是移动平台,所以该格式进行了精简。

不像bitmap那样有54Bytes的文件头,但也包含了必要的信息,包括bitcount, imagetype,width,height。

该文件是由 header + (palette) + data 三部分组成的, 调色板(palette)部分可选。

header

   1: typedef struct tagOBMINFOHEADER
   2: {
   3:   BYTE magic[2];//"OI"
   4:   BYTE imagetype;
   5:   BYTE bitcount;
   6:   WORD width;
   7:   WORD height;
   8: } OBMINFOHEADER;

header部分总共8Bytes, 结构如上面的结构体。

palette

调色板部分的格式主要由bitcount和imagetype决定。

和bitmap一样,bitcount 为 4, 8 的时候有调色板;为24, 32时没有调色板,header之后直接就是data数据区。

palette数据区的大小由 bitcount决定,palettesize = 2^bitcount

data

有调色板时,data数据区是颜色索引。没有调色板时, data数据区是颜色。

需要注意的是,data数据区的数据是从图片的左上角开始的,一直到右下角,和height为正值的bitmap数据排布方式正好相反,也就是height为负值时bitmap的数据排布方式。

下表列出已知的文件格式 palette数据区和data数据区的信息

有调色板

(bitcount<<8) + imagetype 调色板颜色数 调色板每组数据bit数 调色板数据形式 每像素颜色索引bit数
0x0404 16 16 RGB555 4
0x0801 256 32 RGB32 8
0x0803 256 16 RGB444 8
0x0804 256 16 RGB555 8

没有调色板

(bitcount<<8) + imagetype 每像素数据Byte数 n-bit color 数据形式
0x1009 unknown 16 unknown
0x1800 3 24 RGB24
0x1801 4 32 RGB32
0x1802 2 24 RGB565
0x1804 2 24 RGB565
0x2000 3 24 RGB24
0x2001 4 32 RGB32
0x2003 2 32 RGB444
0x2004 2 32 RGB555

*0x1009格式的obm文件不知道具体格式,只是根据之前的格式推测出应该是16bit color

*数据形式(各个颜色所占bit数)

数据形式 red green blue alpha(reserved)
RGB444 4 4 4 4
RGB555 5 5 5 1
RGB565 5 6 5 0
RGB24 8 8 8 0
RGB32 8 8 8 8



例子

以0x0804这种格式的obm文件为例

   1: Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
   2: 00000000   4F 49 04 08 00 02 00 02  3E F8 C9 10 C7 20 09 21 
   3: 00000010   09 19 0B 19 09 29 4D 21  4D 21 0F 21 4D 21 49 31 
   4: 00000020   51 21 53 21 4D 29 4F 21  53 21 49 39 91 21 95 21 
   5: ...........
   6: 00000200   73 F7 B9 F7 B5 FF F9 FF  00 00 00 00 00 00 23 2C
   7: 00000210   3A 1B 0D 13 0A 01 8A 00  00 8A 03 09 17 23 26 52
   8: 00000220   92 14 07 07 07 07 07 07  07 07 07 08 04 8A 05 03

前8个字节,4F 49是OI的ASCII编码,04 为imagetype,08则是bitcount ,由此我们知道调色板有2^8=256种颜色, 00 02 也就是0x0200=512为width图宽,00 02 也就是0x0200=512为height图高。

接下来看OFFSET=0x200处开始的数值,之前我们猜测每16bit表示一种颜色,也就是(0x207-0x8+1)Bytes=256*2Bytes 正好相等,图像数据(data数据区)从0x208处开始。 再看文件总共有262664Bytes ,除去header 8Bytes, 调色板512Bytes,剩下262144Bytes。 而width*height=262144,所以data数据区每字节表示一种颜色索引,八位所能表示的颜色索引数为2^8=256,这和之前我们猜测的调色板颜色数(256)相等。

至于数据表示形式我们可以在编程中实践是RGB565 ,RGB444还是RGB555。经过我的验证应该是RGB555这种形式,R G B 分别用5bit表示,剩下的1bit是用来表示是否透明(alpha)的。

经过以上分析,就可以编写程序把obm的数据读取出来,转换成bitmap。需要注意的是bmp的调色板组成形式是RGBQUAD 也就是 R G B X分别用8bit表示,而且256色的bitmap不支持alpha,X代表reserved。RGB555 转换为RGBQUAD采用掩码 0xF800 0x07C0 0x003E 0x0001。

至于data数据区,0x0804这种obm和256色bitmap是一样的,都是一个字节表示一种颜色索引,直接复制过去就行了。

当然你也可以把调色板,颜色索引都提取出来以后生成png格式的图片文件,png支持透明,效果就更好了。


根据以上分析,我写了一个由obm 转换为bmp格式的程序。

支持的游戏有(ios 平台):
The King of Fighters i 2012
Street Fighter IV Volt
Double Dragon
(另外我发现,很多厂商在制作Android版游戏时,为了省事,会直接采用和iphone版游戏的结构,所以Android版的游戏obm格式也是支持的)

Download

obm2bmp.7z  (含代码)  http://pan.baidu.com/share/link?shareid=70593&uk=1009258824
2014-12-11 更新链接 http://pan.baidu.com/s/1o66yhia

Source Code: https://github.com/lennylxx/obm2bmp

posted @ 2012-07-16 09:27  wwwwwwwww11we  阅读(1503)  评论(4编辑  收藏  举报