如何使用Python制作GIF动态验证码

教你使用 Python 的 Pillow库制作动态验证码

一、安装Pillow

pip install Pillow

二、导入Pillow库

from PIL import ImageDraw,Image,ImageFont,ImageTk
动态图效果展示

三、代码部分

import random,string,tkinter.font as fonts,tkinter,io
from PIL import ImageDraw,Image,ImageFont,ImageTk
# from cacha import *

class ImageGUI(tkinter.Tk):
    def GIF_VSER(self,dir:str=None,width:int = 150,color:tuple[int]=(255,255,255),length:int=5):
        size = (width,int(60/150*width))
        random_str = ''.join(random.choice(string.ascii_uppercase+string.digits) for _ in range(length))
        images:list[Image.Image] = []
        for a1 in range(len(random_str)):
            with Image.new('RGB',size,color) as image:
                font = ImageFont.truetype('321impact.ttf',size=30*width//150)
                draw = ImageDraw.Draw(image)
                x,y,w,h = draw.textbbox((0,0),random_str,font=font)
                if w+10*length>size[0]:raise Exception('图片宽高不合法')
                font_width = w//length
                print(x,y,w,h,font_width)
                for a2 in range(len(random_str)):
                    #color = (0,0,0,200) if a1==a2 else (0,0,0)
                    draw.text(((size[0]-font_width*length+a2*10)//2+font_width*a2-10,(size[1]-h)//2+random.randint(-5,5)),random_str[a2],font=font,fill=random_color())
                image_new = Image.new('RGB',size,color)
                draw2 = ImageDraw.Draw(image_new)
                load_new = image_new.load()
                load_new2 = image.load()
                for y in range(size[1]):
                    offset = random.randint(-1, 0)
                    for x in range(size[0]):
                        newx = x + offset
                        if newx >= size[0]:
                            newx = size[0] - 1
                        elif newx < 0:
                            newx = 0
                        load_new[newx, y] = load_new2[x, y]
                for _ in range(3):
                    x0,y0,radius = random.randint(20,size[0]),random.randint(20,size[1]),5
                    draw2.ellipse((x0-radius,y0-radius,x0+radius,y0+radius),outline=random_color(),width=1)
                for _ in range(3):
                    x1,x2,y1,y2 = 0,random.randrange(size[1]),size[0],random.randrange(size[1])
                    draw2.line((x1,x2,y1,y2),fill=random_color(),width=1)  
                images.append(image_new)
        if dir:images[0].save(os.path.join(dir,time.strftime('%S'),'.gif'),save_all=True,append_images=images[1:],duration=100,loop=0)
        else:return [ImageTk.PhotoImage(image) for image in images]

    def start(self):
        self.IMAGES=self.GIF_VSER(width=300)
        self.w,self.h = 500,200
        self.title('GIF窗口')
        self.resizable(False,False)
        self.center()
        self.lbl_fps=tkinter.Label(self,text='fps:0',font=fonts.Font(family="微软雅黑", size=40))
        self.lbl_fps.pack(side=tkinter.TOP)
        def chenge():self.IMAGES=self.GIF_VSER(width=300)
        self.button=tkinter.Button(self,text='点击换图',command=chenge)
        self.button.pack(side=tkinter.TOP)
        self.funcs()
        self.mainloop()

    def funcs(self,index:int=0):
            self.lbl_fps['image']=self.IMAGES[index]
            #self.update()
            self.after(100,self.funcs,(index + 1) % len(self.IMAGES))

    def center(self):
            ws = self.winfo_screenwidth()
            hs = self.winfo_screenheight()
            x = int((ws / 2) - (self.w / 2))
            y = int((hs / 2) - (self.h / 2))
            self.geometry('{}x{}+{}+{}'.format(self.w, self.h, x, y))

if __name__ == '__main__':
   ImageGUI().start()
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值