A9VG电玩部落论坛

 找回密码
 注册
搜索
查看: 7422|回复: 7

[原创]编写程序显示Tim2图片

[复制链接]
zxp

精华
1
帖子
779
威望
1 点
积分
1248 点
种子
522 点
注册时间
2004-4-2
最后登录
2024-12-18
 楼主| 发表于 2006-1-22 11:46  ·  北京 | 显示全部楼层 |阅读模式
现在ps2汉化比较流行,所以就写点,希望对你有帮助。

我用这张图片做讲解,来编写程序显示它。



点击下载Tim2格式

这张图是8bpp,256色,512*448的,显示方法就是在窗体上用点把这张图画出来,文件的最后1024字节是调色板,4个字节是1个颜色,格式是RGBA(红,绿,蓝,alpha),这么排列,共256色,文件的40H开始是图像数据,1个字节代表一个点,比如40H上7BH,10进制就是123,就是这个点用调色板的第123个颜色显示,知道了原理用什么语言写都是一样的。

先建了一个项目,把窗体拉大点,在放上一个pictureBox控件,我们要在画在这个空间上,也拉大点,在放个按钮,点击就显示图片,如下图



打开代码编辑器,开始写代码了
先建立一个空方法DrawShaper,这个方法就是把图片画到pictureBox控件,
代码

public void DrawShaper(Graphics g)
{
}

接着先打开文件,读取里边的调色板。
代码

FileStream stream = new FileStream(Application.StartupPath+"\\"+"1.tm2", FileMode.Open, FileAccess.Read);
Byte[] Palette = new Byte[1024];
stream.Seek(-1024, SeekOrigin.End);
stream.Read(Palette, 0, Palette.Length);

1行是只读方式打开文件,变量stream就是这个打开的文件。
2行是创建一个字节数组,大小是1024,存储调色板
3行是把文件定位。
4行是把调色板读到字节数组里。

接着读取图像数据,图像数据大小不像调色板256色就是1024字节,它多少都有,但tim2文件头有定义,所以现要从文件头把大小读出来。
代码

Byte[] BitmapDatadx1 = new Byte[3];
stream.Seek(24, SeekOrigin.Begin);
stream.Read(BitmapDatadx1, 0, BitmapDatadx1.Length);
string temp1 = BitmapDatadx1[2].ToString("x2") + BitmapDatadx1[1].ToString("x2") + BitmapDatadx1[0].ToString("x2");//高低位转换
string temp2 = int.Parse(temp1, System.Globalization.NumberStyles.HexNumber).ToString(); //把16进制转成10进制
int BitmapDatadx = int.Parse(temp2);
//读取图片数据
Byte[] BitmapData = new Byte[BitmapDatadx];
stream.Seek(64, SeekOrigin.Begin);
stream.Read(BitmapData, 0, BitmapData.Length);

都读完了该显示了,用pen语句定义调色板里的颜色,tim2里的调色板不是按顺序存放的,调色板开始的32个字节8个颜色,是对应颜色索引0-7,后面的32个字节8个颜色,是对应颜色索引16-23,在后面才是对应颜色索引8-15,依次类推24-31。要注意,pen语句的颜色格式是argb,在这里alpha都定义为255。

代码

Pen[] p=new Pen[256];
int no = 0;//循环变量,每次+4,4个字节是1个颜色
int no1 = 0; //循环变量,够8次跳32个字节
int no2 = 0;
for (int i = 0; i < 256; ++i)//读取调色板单行颜色{
      no1 += 1;
      no2 += 1;
      p = new Pen(Color.FromArgb(255, Palette[no], Palette[no + 1], Palette[no + 2 ]),1);
      no +=  4;
      if (no1 == 8)//读取1行16个颜色跳1行
    {
          no+=32;
          no1 = 0;
      }
       if (no2 == 16)
       {
           i += 16;
           no2 = 0;
        }
}
      no = 32;
      no1 = 0;
      no2 = 0;
for (int i = 16; i < 256; ++i)
{
      no1 += 1;
      no2 += 1;
      p = new Pen(Color.FromArgb(255, Palette[no], Palette[no + 1], Palette[no + 2]), 1);
      no += 4;
      if (no1 == 8)
      {
          no += 32;
          no1 = 0;
       }
       if (no2 == 16)
       {
          i += 16;
          no2 = 0;
        }
}

估计不好理解,我写的也乱,来张调色板的图,可能好理解下。



到最后了,该真的画了,

代码

int x = 0;//x坐标
int y = 0;//y坐标
for (int ii = 0; ii < BitmapData.Length; ++ii)
{
g.DrawRectangle(p[BitmapData[ii]], 0+x, 0+y, 1, 1);
x += 1;
  if (x == 512) //够512就是1行了,把y坐标+1,在下1行在画
  {
    x = 0;
    y += 1;
  }
}
g.DrawRectangle是画方块的语句,c#里没有画点语句,就用它代替了。

已经都搞定了,还有个显示按钮,双击把下面代码写上就行了。

代码

Graphics g = pictureBox1.CreateGraphics();
DrawShaper(g);

启动下看看效果吧,图片在一点一点的被画出来了。



项目文件下载,需要vs2005打开.

精华
0
帖子
31
威望
0 点
积分
44 点
种子
0 点
注册时间
2005-9-4
最后登录
2010-4-25
发表于 2006-1-30 10:51  ·  广东 | 显示全部楼层
最近正在研究tim2文件格式,感谢楼主提供

精华
0
帖子
31
威望
0 点
积分
44 点
种子
0 点
注册时间
2005-9-4
最后登录
2010-4-25
发表于 2006-1-30 11:37  ·  广东 | 显示全部楼层
除了8bpp,256色的格式,还有其他bpp的格式介绍吗?

精华
1
帖子
1181
威望
1 点
积分
1251 点
种子
2 点
注册时间
2004-7-24
最后登录
2020-1-15
发表于 2006-3-8 17:06  ·  四川 | 显示全部楼层
不错,按照楼主的叙述。。。自己用VC6.0又写了一遍。(手头上没VS2005)。
同楼上的还有没有其它格式的介绍啊?
wyy

精华
0
帖子
6748
威望
0 点
积分
7170 点
种子
534 点
注册时间
2004-4-2
最后登录
2024-12-23
发表于 2006-3-10 17:38  ·  北京 | 显示全部楼层
其它格式 自己研究下吧,我没能,还有4bpp 24bpp,其实可以转成bmp,在显示,速度就快的多了

精华
0
帖子
1
威望
0 点
积分
1 点
种子
5 点
注册时间
2009-4-29
最后登录
2019-8-6
发表于 2012-4-18 16:48  ·  山东 | 显示全部楼层
您好 我想询问一下图片tim2提取的有关技术
最近打算提取一个PSP游戏-尸体派对影之书的CG图
该ISO的文件结构是基本都用AFS格式把数据压缩了
我拆开AFS之后找到了有关CG的文件夹 不过都是.KLZ格式
我用HEX打开看了一下里边的KLZ格式涵盖了TIM2内容
但是看起来并不是标准TIM2 这些KLZ文件的0x00-0x06看起来是多余的东西
拿其中一个举例来说,它的0x00-0x06是
00 00 24 20 1D 73 00
从0x07开始才是 54 49 4D 32
DUMP了一下 从TIM2字节开始移到了0x00起始
前3行就成了这样子
54 49 4D 32 04 00 01 00 81 00 05 30 02 02 00 00
04 01 00 20 FE 01 00 30 00 03 00 01 03 90 05 E0
01 10 04 00 30 65 03 20 0C 00 60 00 81 00 08 BA
看起来该TIM2应该是0x40文件头 但是按照这么看的话
那么0x24 0x25表示的宽度和0x26 0x27表示的高度像素相当惊人了
我抽出了其中几个KLZ文件看了一下 多数都是6530H 2003H 而且色深也相当高 E005H
拿这么大的数值计算的话 那数据区不是大的离谱嘛
单个的KLZ文件本身并没达到那么高容量 我拿这样的TIM2文件用TIM2Converter提取不出来任何PNG或者BMP图片

是不是这些KLZ格式还有另外一个较大的关联文件 或者说本身并不是一个完整的TIM2 只含有文件头和一部分数据区
而把另一部分数据区和调色盘另外存储一个文件来单独或者所有KLZ文件共同调用呢

也或者说这个KLZ格式文件还有什么别的方式可以解读,求专业选手赐教。

精华
0
帖子
827
威望
0 点
积分
1203 点
种子
5 点
注册时间
2011-9-29
最后登录
2017-11-23
发表于 2012-4-18 17:16  ·  江苏 | 显示全部楼层
应该是压缩了吧                                          。

精华
0
帖子
8
威望
0 点
积分
8 点
种子
0 点
注册时间
2012-4-26
最后登录
2013-12-29
发表于 2012-4-26 23:31  ·  北京 | 显示全部楼层
看不明白,太牛了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|A9VG电玩部落 川公网安备 51019002005286号

GMT+8, 2024-12-23 21:58 , Processed in 0.227365 second(s), 23 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部