python处理GIF

也是秋季校赛的题,我觉得这个题出的还算不错,结果出题自己的解法……惊艳到我了

0x00 题目原件

我想着这题还挺有趣……结果出题人自己不会写exp,在Excel表格上画二维码……

0x01 分解GIF

这里用到一个三方库pillow,这是在标准库PIL的基础上的拓展,更兼容,实用。

 from PIL import Image, ImageSequence
 
 with Image.open("d96i7-d9ej7.gif") as im:   #打开动图
     index = 1
     for frame in ImageSequence.Iterator(im):    #分解动图
         frame.save(f"gif{index}.png") #输出每一帧
         index += 1

然后就得到了每一帧的图片

0x02 拼接二维码

这一步就比较坑了,GIF也不是代码生成的,是出题师傅手动滑出来的……所以速度不是均衡的,关键帧的那几张不是均匀分布的,需要手动找到,并记下编号。

第一个坑就是它录屏的最上方,有一条黑线……直接拼出来就会全是黑线,没办法那只好……裁剪了。

 from PIL import Image, ImageSequence
 from os import listdir
 
 x = 0
 y = 1
 w = 228 
 h = 7
 
 #关键帧
 listnum =[20,27,33,39,45,52,58,
           64,70,77,83,90,96,102,
           109,118,125,132,141,148,
           157,164,172,180,188,196,
           204,211,220,227]
 imglist = []
 
 # 截取图片掉图片上面的黑线
 for i in listnum:
     imgname = f"gif{i}.png"
     img = Image.open(imgname)
     region = img.crop((x, y, x+w, y+h)) 
     imglist.append(region)
     
 #创建空白图
 result = Image.new("RGB", (228, h * len(imglist)),"white")  
 i = 0
 for im in imglist:
     result.paste(im,box=(0, i*h ))  #拼接
     i += 1
 
 result.save("flag.png")

两个exp,解决!

得到完整的二维码。