gif编解码python实战

前言:去年曾写过一个维信机器人,目的是为了方便管理我个人建的一个微信群,当时想在维信消息里面做个带UI的小游戏,但是会受到微信消息框的约束,思来想去,就干脆通过gif来呈现吧,大致就是用户在微信群里发命令,机器人就会根据命令做出相应动作,并通过gif的形式呈现出来。

本例代码可以从如下链接中获得

https://github.com/shanlihou/pythonFunc/tree/master/gif

python test.py,可以通过一个小游戏飞行棋,生成对应的gif

python gifHelper.py可以解析当前文件夹下box.gif的文件,为了测试方便

正题:

0x01:GIF头

先上uedit上的二进制截图,被红框框出来的就是gif的头部


下面是如上头部解析后的内容,可以看到有:版本号,宽高


m1:占1位全局颜色列表标志,置位则后面紧跟全局颜色列表

cr3:占3位颜色深度,为取值+1为某一原色位数,则111为7,7+1,所以每个像素颜色深度占3*8位

s1:占1位,排序标志,置位情况下颜色列表按照频率排序

pixel3:占3位,2^(pixel + 1)全局颜色列表大小,010则为2^(2 + 1)=8

bgColor:背景色,在全局列表中索引的位置

W:H:宽高比

接下来13-37字节为全局颜色列表,这个大小为3 * 8,8就是前面的全局颜色列表大小,每三个字节一个rgb值。

下面是python解析gif头并打印的代码

    def parseGif(self, fileName):
        fileRead = open(fileName, 'rb')
        tmp = fileRead.read(6)
        print '_' * 60   
        self.formatPrint(0, 6, tmp, 'ver')
        
        tmp = fileRead.read(7)
        self.formatPrint(6, 8, ord(tmp[0]) + ord(tmp[1]) * 256, 'width')
        self.formatPrint(8, 10, ord(tmp[2]) + ord(tmp[3]) * 256, 'height')
        
        comment = ['m1:cr3:s1:pixel3', 'bgColor', 'W:H']
        for i in xrange(3):
            self.formatPrint(i + 10, i + 11, self.get2(ord(tmp[i + 4])), comment[i])
        pixel = ord(tmp[4]) & 0x7
        pixel_size = int(math.pow(2, pixel + 1))
        m = ord(tmp[4]) & 0x80
    
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值