TIM2是PS2游戏最常用的图片格式
几乎所有的游戏都是用这种格式
简单的说
标准的TIM2 就是BMP的调色板中加入了透明度
游戏中很少出现标准的TIM2
大多数图片的文件头都不同
很多游戏根本就没有图片文件头
调色板和图像数据也往往不会放在一起
有关标准TIM2就说这么多了
其他的就请自行研究吧
有关标准TIM2的提取
以机器人大战A.C.E.2为例
http://www4.emu-zone.org/images/tmp/pcsx2/oz01/a/CrystalTile.rar
需要的工具就这一个
此工具不能一次性完全打开比较大的文件
最多一次10000000H
打开文件时具体怎么操作我就不多说了
A.C.E.2中含有图片的文件是DATA.BIN
图片的具体位置大家自己找吧
文件末尾比较多……
28545560H附近是角色头像
上面的HEX图标是切换图像视图和HEX视图
图像视图最左上的像素与HEX视图第一行第一个字节相对应
用CrystalTile打开文件之后
钩上调色板中的“16/32位颜色模式”
上面有个图标是由四个小方块和一个向上的箭头组成
此图标的作用是把
从目前HEX视图中选中的那个字节开始
16行数据转换为调色板
具体效果请自行尝试
此游戏的图片有文件头,非标准
文件头由2行组成
第一行前4个字节(0、1、2、3)是文件大小,16进制
4、5是图像高度、8、9是高度,也是16进制
0 1 2 3 4 5 6 7 8 9 A B C D E F
例如 20 84 00 00 00 80 00 00 01 00 00 00 00 00 00 00
图像大小为008420H(字节反排列)
高度0080H=128
宽度0100H=256
第二行不详
图片大小=图片文件头的20H +高度*宽度H+长度为400H的调色板
也就是说
通过图片长宽就可以知道图片文件头
文件头都是“左对齐”
因此很容易就能被搜索到
找到图片文件头之后
就可以找到图片的调色板的具体位置
例如某图片文件头在28545560,宽256、高128
下数2行
28545580就是图像开始的位置
下移80H*100H=8000H
也就是2854D580这一行的第一个字节就是调色板第一个字节
鼠标左键点击它
按导入调色板的按钮
再回到28545580
切换到图像视图
右边宽度填256
缩放1
颜色格式为GBA 8bpp
现在应该能看到正确的图象了……
如果这时的图有些偏移,可以按住Ctrl+方向键左或右调整
下面说说图像数据交错模式的TIM2
这种图片也很常见
以下内容作者为:geeses
BIO HAZARD 4 (J) 中的 title.dat在DATA.AFS文件中,可以用一些AFS解包工具提取
对 BIO HAZARD 4 (J) 中的 title.dat 进行研究,以下四个区域有一些进展。
将一个区域的数据另存为一个独立文件后,可视为 TIM2 图片文件。
licenced by nintendo
0x0002B250-
0x0002C68F
the another order
0x0002F820-
0x00030C5F
warning 警告-暴力场景
0x000AD5E0-
0x000BDA1F
sfd Sofdec-ADX
0x0013F260-
0x0015F69F
TIM2 文件中,
0x00000000-
0x0000003F
为文件头,其中
0x00000010-
0x00000011 WORD 16bit 高位在后
为图片宽度,
0x00000012-
0x00000013 WORD 16bit 高位在后
为图片高度,
将图片宽度乘以图片高度即可得到像素数量。
从 TIM2 的 0x00000040 开始,就是像素点描述区域,因为每个像素点使用一个字节(代表此像素点使用之后调色板中的第几号颜色),所以区域字节长度就是像素数量,亦即每张图片中的每个像素有256种颜色可供选择。
像素点描述区域的排列顺序:在前两张小图片(licence, another)中为直接顺序排列,后两张较大的图片中经过乱序处理,处理算法见后。
像素点描述区域之后是字节长度固定为1024的调色板区域,每一种颜色使用四个字节,格式为RGBA(?未经确认)(注1),每个原色使用一个字节,Alpha计算法未经确认,256个颜色排列是顺序还是倒序未经确认(注2)。
乱序后的像素点排列顺序:
以下每个
----
| |
----
就代表一个像素的位置,中间的数字代表像素原本在 TM2 文件中的顺序序列
if ((i/(width*4))%2==0) //当前像素编号位于 以四行像素为单位 的奇数区域内
if ((i/(width*2))%2==0) //当前像素编号位于 这四行像素中的第一、第三行区域内
if ((i/16)%2==0) //当前像素编号位于 以16个像素为单位 的奇数区域内
------------------------------------------------- ------------------------------------------------
第一(0)行 | 0| 4| 8|12| | | | | 2| 6|10|14| | | | | 32|36|40|44| | | | |34|38|42|46| | | | |...........
------------------------------------------------- ------------------------------------------------
第二(1)行 | | | | | | | | |...........
------------------------------------------------- ------------------------------------------------
第三(2)行 | | | | | 1| 5| 9|13| | | | | 3| 7|11|15| | | | |33|37|41|45| | | | |35|39|43|47|...........
------------------------------------------------- ------------------------------------------------
第四(3)行 | | | | | | | | |...........
------------------------------------------------- ------------------------------------------------
............................................................................................................
else //当前像素编号位于 以16个像素为单位 的偶数区域内
-------------------------------------------------
| | | | |16|20|24|28| | | | |18|22|26|30|
-------------------------------------------------
| | | | |
-------------------------------------------------
|17|21|25|29| | | | |19|23|27|31| | | | |
-------------------------------------------------
| | | | |
-------------------------------------------------
else //当前像素编号位于 这四行像素中的第二、第四行区域内
if ((i/16)%2==0)
-------------------------------------------------
| | | | |
-------------------------------------------------
|32|36|40|44| | | | |34|38|42|46| | | | |
-------------------------------------------------
| | | | |
-------------------------------------------------
| | | | |33|37|41|45| | | | |35|39|43|47|
-------------------------------------------------
else
-------------------------------------------------
| | | | |
-------------------------------------------------
| | | | |48|52|56|60| | | | |50|54|58|62|
-------------------------------------------------
| | | | |
-------------------------------------------------
|49|53|57|61| | | | |51|55|59|63| | | | |
-------------------------------------------------
else //当前像素编号位于 以四行像素为单位 的偶数区域内
if ((i/(width*2))%2==0)
if ((i/16)%2==0)
-------------------------------------------------
| | | | | 0| 4| 8|12| | | | | 2| 6|10|14|
-------------------------------------------------
| | | | |
-------------------------------------------------
| 1| 5| 9|13| | | | | 3| 7|11|15| | | | |
-------------------------------------------------
| | | | |
-------------------------------------------------
else
-------------------------------------------------
|16|20|24|28| | | | |18|22|26|30| | | | |
-------------------------------------------------
| | | | |
-------------------------------------------------
| | | | |17|21|25|29| | | | |19|23|27|31|
-------------------------------------------------
| | | | |
-------------------------------------------------
else
if ((i/16)%2==0)
-------------------------------------------------
| | | | |
-------------------------------------------------
| | | | |32|36|40|44| | | | |34|38|42|46|
-------------------------------------------------
| | | | |
-------------------------------------------------
|33|37|41|45| | | | |35|39|43|47| | | | |
-------------------------------------------------
else
-------------------------------------------------
| | | | |
-------------------------------------------------
|48|52|56|60| | | | |50|54|58|62| | | | |
-------------------------------------------------
| | | | |
-------------------------------------------------
| | | | |49|53|57|61| | | | |51|55|59|63|
-------------------------------------------------
另外,因为网页制作时默认省略了每行开始的空格和制表符(tab),导致那些用于说明 TIM2 交错排列方式的 ASCII 字符画的框,都被打乱了
另外,上中提到、但未给出算法的“Alpha计算法”可能是下面这样的,但未经确认,仅供参考:
前景色红 = (背景色红 * (0x80-alpha)/0x80 )+(前景色红 * alpha/0x80 )
前景色绿 = (背景色绿 * (0x80-alpha)/0x80 )+(前景色绿 * alpha/0x80 )
前景色蓝 = (背景色蓝 * (0x80-alpha)/0x80 )+(前景色蓝 * alpha/0x80 )
注1 :调色板每种颜色的4个字节分别是R、G、B、Alpha通道
注2 :顺序每8个颜色交错排列