「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