ANIM1是什么图像格式

逆向工程 文件格式 qnx
2021-06-17 01:18:48

我正在研究在 QNX 上运行的汽车导航软件,并想用我自己的动画替换启动动画。我在固件中找到了扩展名为 .canim 的文件,这可能代表压缩动画。

这些文件是 zlib 压缩的,在放气后文件以 HEX 41 4E 49 4D 31 20 20 20 20 03 00 00 E0 01 00 00(ANIM1) 开头。我的问题是这是什么文件格式?(可能匹配:Amiga ANIM

我知道设备的屏幕分辨率是 800x480,所以在 DWORD 3&4 之后是分辨率(20 03 00 00-> 80 和E0 01 00 00-> 480

我已经在这里上传了文件,bin 文件是 .canim 文件的压缩版本。

编辑:一些附加信息:我在同一个文件夹中找到了启动图片,它们是 zlib 压缩的,是简单的 RGB 对,填充 00 以在 DWORD 处对齐,例如: 04 02 04 00 04 02 04 00 04 02 04 00 04 02 04 00

EDIT2:这个站点有每个可能的启动动画的视频。这些是我提取的启动图片: 启动_generic.raw2

startup_vw_dynaudio.raw2

1个回答

图像数据存储为原始 RGBA 四边形,宽度/高度/开始在靠近开头的块中定义。

您可以使用此 python 脚本从未压缩的 bin 中提取图像数据:

import struct
import sys
import os
from PIL import Image

if len(sys.argv) != 3:
  print 'usage: process.py <filename> <outdir>'
  sys.exit(1)

out_dir = sys.argv[2]
if not os.path.exists(out_dir):
  os.mkdir(out_dir)

data = open(sys.argv[1],'rb').read()
offset = 0

(magic,) = struct.unpack_from('<8s', data, offset)
offset = offset + 8

if magic != 'ANIM1   ':
  print 'incorrect magic!'
  sys.exit(1)


(stage_width, stage_height, cmdblock_len, unk) = struct.unpack_from('<LLLL', data, offset)
offset = offset + 16

print "stage_width: %d\nstage_height: %d\ncmdblock_len: %d\n" %(stage_width, stage_height, cmdblock_len)

(cmd_code, img_num, img_width, img_height, bytes_per_pixel, data_start) = struct.unpack_from('<LLLLLL', data, offset)

while cmd_code == 0x11:
  print 'generating img_%d' % (img_num)
  im = Image.frombuffer('RGBA', (img_width, img_height), data[0x20+cmdblock_len+data_start:], 'raw', 'RGBA', 0, 1)
  im.save(os.path.join(out_dir, 'img_%d.png'%img_num))
  offset = offset + 0x20
  (cmd_code, img_num, img_width, img_height, bytes_per_pixel, data_start) = struct.unpack_from('<LLLLLL', data, offset)

必须使用该初始块中的其他数据将它们合成到实际动画中。

您可以注入自己的相同尺寸/格式的图像来替换动画元素。它不会让您完全控制,但它应该为您提供一些自定义动画的基本功能。