首先我们要了解,wzl与wzx的对应关系,wzx里面存的是每张二进制图片数据在wzl中的偏移量,所以取到wzx中的偏移数据就可以取到wzl每张图片数据,其实就这么简单。
1[取wzx中偏移量数据]:以素材[hum.wzx]为例进行解析
-读取前44字节为wzx头文件,对解析无作用不做处理
-读取44至48字节代表为,[wzx中偏移值总数量] [int类型] [4字节]
-读取48字节以后,每4个字节[int类型]为一个图片的偏移量
with open('hum.wzx', 'rb') as wzx_file:
wzx_file.seek(44) # 指针指向44字节位置
wzx_data = wzx_file.read(4) # 读取4字节数据
image_number = struct.unpack('I', wzx_data)[0] # 解析出图片的总数量数量
image_data = [] # 定义空数组准备接收for循环里面获取到的偏移值
for i in range(image_number): # 根据总数量来决定取要在wzx中获取多少条数据
wzx_file.seek(48 + (i * 4)) # 从48字节开始 每次指针偏移4字节
wzx_data = wzx_file.read(4) # 每次读取4字节
num = struct.unpack('I', wzx_data)[0] # 取到每个图片在wzl中的偏移量
image_data.append(num)# 将每一个偏移值存入image_data 数组
2.[取wzl中图片偏据]:根据wzx中取得数据对[hum.wzl]进行解析:
-根据在wzx中取得的偏移值总数量,每张图片偏移值在wzl中取图片数据
-从44字节-48字节 int类型 代表[图片总数量]
-根据wzx中取得的偏移量数组来定位指针,取指针后16字节为一个图片结构体
结构体为 [Byte][Byte][Byte][Byte][short][short][short][short][int]
通过struct.unpack('BBBBhhhhI',read(16))来将二进制数据流解析
with open('hum.wzl', 'rb') as wzl_file:
for i in image_data: # 遍历偏移量数组来对wzl取数据
wzl_file.seek(i) # 定位偏移值
pixelFormat, compressed, reserve, compressLevel, width, height, x, y, size = struct.unpack('BBBBhhhhI', wzl_file.read(16)) # 解析取到图片结构体
# print("像素格式:", pixelFormat)
# print("压缩:", compressLevel)
# print("预留:", reserve)
# print("压缩等级:", compressLevel)
# print("图片宽度:", width)
# print("图片高度:", height)
# print("X坐标:", x)
# print("Y坐标:", y)
# print("图片二进制数据长度:", size)