struct模块小练习,判断位图Python3

# -*- coding:utf-8 -*-

import base64,struct
 
bmp_data=base64.b64decode('Qk1oAgAAAAAAADYAAAAoAAAAHAAAAAoAAAABABAAAAAAADICAAASCwAAEgsA    AAAAAAAAAAAA/3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f    /9/AHwAfAB8AHwAfAB8AHwAfP9//3//fwB8AHwAfAB8/3//f/9/AHwAfAB8AHz/f/9//3//f/9//38AfAB8AHwAfA    B8AHwAfAB8AHz/f/9//38AfAB8/3//f/9//3//fwB8AHz/f/9//3//f/9//3//f/9/AHwAfP9//3//f/9/AHwAfP9    //3//fwB8AHz/f/9//3//f/9/AHwAfP9//3//f/9//3//f/9//38AfAB8AHwAfAB8AHwAfP9//3//f/9/AHwAfP9/    /3//f/9//38AfAB8/3//f/9//3//f/9//3//fwB8AHwAfAB8AHwAfAB8/3//f/9//38AfAB8/3//f/9//3//fwB8A    Hz/f/9//3//f/9//3//f/9/AHwAfP9//3//f/9/AHwAfP9//3//fwB8AHz/f/9/AHz/f/9/AHwAfP9//38AfP9//3    //f/9/AHwAfAB8AHwAfAB8AHwAfAB8/3//f/9/AHwAfP9//38AfAB8AHwAfAB8AHwAfAB8/3//f/9//38AfAB8AHw    AfAB8AHwAfAB8/3//f/9/AHwAfAB8AHz/fwB8AHwAfAB8AHwAfAB8AHz/f/9//3//f/9//3//f/9//3//f/9//3//    f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//38AAA==')

#先对文本数据str,解码为二进制bytes


def bmp_info(data):      
        tup = struct.unpack('<ccIIIIIIHH',data)  #根据window是位图的文件格式进行设定(一定要有前缀<,笔者就忘了结果各种出错)
        dic = {}
        if tup[0] == b'B' and tup[1]==b'M':     #因返回的数据类型为元组,其中第1个和第2为固定的b'B'和b'M'
                print('bmp picture')                      #若不是,则不是位图
                dic['width']=tup[-4]
                dic['height']=tup[-3]
                dic['color']=tup[-1]
        return dic

bi = bmp_info(bmp_data)
print(bi)                                                        #打印成果(以字典的形式)



#摘至廖雪峰博客

#BMP格式采用小端方式存储数据,文件头的结构按顺序如下:

两个字节:'BM'表示Windows位图,'BA'表示OS/2位图;
一个4字节整数:表示位图大小;
一个4字节整数:保留位,始终为0;
一个4字节整数:实际图像的偏移量;
一个4字节整数:Header的字节数;
一个4字节整数:图像宽度;
一个4字节整数:图像高度;
一个2字节整数:始终为1;
一个2字节整数:颜色数。

<I表示4个字节整数

<H表示2个字节的整数

<IH表示4个字节整数,2个字节整数

>IH 表示后面字节数依次为 I 4个字节整数, H 2个字节整数??? (struct.pack()or unpack)

> 表示字节顺序为big-endian 网络序???即先发送高字节数据再发送低字节数据(如:四个字节由高位向低位用0-31标示后,将首先发送0-7位第一字节,在发送8-15第二字节,以此下去)

unpack将二进制bytes转为相应的(这里是图片)数据


猜你喜欢

转载自blog.csdn.net/sinat_41701878/article/details/79332413