• 「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

  • 相关阅读:
    c#遍历一个对象中所有的属性和值
    Redis和Memchaed缓存数据查询
    ASP.NET结合Redis实现分布式缓存
    C#使用Spire.Doc Word for .Net读写Word
    DataTable序列化
    ASP.NET网站不能在VS中调试
    winform窗体运行时的大小和设计时不一致
    ajax请求aspx.cs后台方法
    jQuery判断鼠标滚动方向
    使用MagickNet编辑图片
  • 原文地址:https://www.cnblogs.com/bl4nk/p/2909123.html
Copyright © 2020-2023  润新知