Python Struct读取bmp图片信息

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

猜你喜欢

转载自blog.csdn.net/zoujin6649/article/details/81357696