图像的基本处理六(绘制验证码)

✨✨✨ 感谢优秀的你打开了小白的文章 “希望在看文章的你今天又进步了一点点,离美好生活更近一步!”🌈

🚀往期回顾

图像的基本处理(一) 图像的基本处理(二) 图像的基本处理(三)
图像的基本处理(四)

🍉知识储备

Image.new(): 这个方法可以生成一张图片,有三个参数。 mode:颜色空间模式,可以是RGBA,RGB,L等等模式 size:图片尺寸,接收一个两个整数的元组 color:图片的填充颜色,可以是red,green等,也可以是rgb的三个整数的元组。也就是背景颜色

🍉代码生成

获取对象

draw_obj=ImageDraw.Draw(img)
def get_color():
    return (random.randint(200,255),random.randint(200,255),random.randint(200,255))
for x in range(width):
    for y in range(height):
        draw_obj.point((x,y),fill=get_color())

生成随机字母

def get_char():
    return chr(random.randint(65,90))
font=ImageFont.truetype(simsun.ttc,36)

绘制字母

for i in range(4):
    draw_obj.text((10+i*20,40),get_char(),font=font,fill=(255,0,0))

绘制干扰线

draw_obj.line((0,0,100,100),fill=red,width=5)
img.show()

🍉完整代码

from PIL import Image,ImageDraw,ImageFont
import random
width,height=100,100
img=Image.new(RGB,(width,height),(255,255,255))
#获取draw_obj对象
draw_obj=ImageDraw.Draw(img)
def get_color():
    return (random.randint(200,255),random.randint(200,255),random.randint(200,255))
for x in range(width):
    for y in range(height):
        draw_obj.point((x,y),fill=get_color())

#生成随机的字母
def get_char():
    return chr(random.randint(65,90))
font=ImageFont.truetype(simsun.ttc,36)
#绘制随机字母
for i in range(4):
    draw_obj.text((10+i*20,40),get_char(),font=font,fill=(255,0,0))

#绘制干扰线
draw_obj.line((0,0,100,100),fill=red,width=5)
img.show()

结果展示:

🍉 复杂应用

#coding=utf-8
import random
import string
import sys
import math
from PIL import Image,ImageDraw,ImageFont,ImageFilter
font_path = SIMLI.TTF
#生成几位数的验证码
number = 4
#生成验证码图片的高度和宽度
size = (100,30)
#背景颜色,默认为白色
bgcolor = (255,255,255)
#字体颜色,默认为蓝色
fontcolor = (0,0,255)
#干扰线颜色。默认为红色
linecolor = (255,0,0)
#是否要加入干扰线
draw_line = True
#加入干扰线条数的上下限
line_number = (1,5)
 
#用来随机生成一个字符串
def gene_text():
    source = list(string.ascii_letters)
    for index in range(0,10):
        source.append(str(index))
    return .join(random.sample(source,number))#number是生成验证码的位数
#用来绘制干扰线
def gene_line(draw,width,height):
    begin = (random.randint(0, width), random.randint(0, height))
    end = (random.randint(0, width), random.randint(0, height))
    draw.line([begin, end], fill = linecolor)
 
#生成验证码
def gene_code():
    width,height = size #宽和高
    image = Image.new(RGBA,(width,height),bgcolor) #创建图片
    font = ImageFont.truetype(font_path,25) #验证码的字体
    draw = ImageDraw.Draw(image)  #创建画笔
    text = gene_text() #生成字符串
    font_width, font_height = font.getsize(text)
    draw.text(((width - font_width) / number, (height - font_height) / number),text,
            font= font,fill=fontcolor) #填充字符串
    if draw_line:
        gene_line(draw,width,height)
    # image = image.transform((width+30,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR)  #创建扭曲
    image = image.transform((width+20,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR)  #创建扭曲
    image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强
    image.save(idencode.png) #保存验证码图片
if __name__ == "__main__":
    gene_code()

结果展示:

经验分享 程序员 微信小程序 职场和发展