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,解决!
得到完整的二维码。