教你使用 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()