struct的pack函数可以把任意数据类型变成bytes:
>>> import struct
>>> struct.pack('>I',10240099)
b'\x00\x9c@c'
pack的第一个参数是处理指令,'>I'的意思是: >表示字节顺序是big-endian,也就是网络序,I表示4字节无符号整数。
struct的unpack函数把bytes变成相应的数据类型:
>>> import struct
>>> struct.unpack('>IH',b'\xf0\xf0\xf0\xf0\x80\x80')
(4042322160, 32896)
'>IH'的意思是:后面的bytes依次变为I:4字节无符号整数和H:2字节无符号整数
Windows的位图文件(.bmp)是一种采用小端方式存储数据,文件头的结构顺序如下:
两个字节:'BM'表示Windows位图,'BA'表示OS/2位图
一个4字节整数:位图大小
一个4字节整数:保留位,始终为0
一个4字节整数:实际图像的偏移量
一个4字节整数:Header的字节数
一个4字节整数:图像宽度
一个4字节整数:图像高度
一个2字节整数:始终为1
一个2字节整数:颜色数
所以,组合起来用unpack读取:
>>> struct.unpack('<ccIIIIIIHH', s)
(b'B', b'M', 691256, 0, 54, 40, 640, 360, 1, 24)
b'B、b'M说明是Windows位图,位图大小为640*360,颜色数为24
举例读取文件
#!usr/bin/env python3
# -*- coding:utf-8 -*-
import base64,struct
with open('test001.bmp','rb') as f:
s=f.read(30)
print(s)
def bmp_info():
unpackbuf=struct.unpack('<ccIIIIIIHH',s)
if (unpackbuf[0]!=b'B' or unpackbuf[1]!=b'M'):
return None
else:
return {'width':unpackbuf[6],'height':unpackbuf[7],'color':unpackbuf[9]}
bi=bmp_info()
print(bi['width'],bi['height'],bi['color'])
PS F:\Work> python bmpinfo.py
b'BM\xe6\x15\x02\x00\x00\x00\x00\x006\x04\x00\x00(\x00\x00\x00\xc2\x01\x00\x00,\x01\x00\x00\x01\x00\x08\x00'
450 300 8