pillow
pip3 install pillow
创建图片
from PIL import Image# 创建一张大小为120x30px的图片背景颜色为白色img = Image.new(mode='RGB', size=(120,30), color=(255,255,255))# 在图片查看器中打开img.show()# 保存图片到本地with open('code.png', 'wb') as f:img.save(f, format='png')
画笔
用于在图片上画任意的内容
# 创建画笔img = Image.new(mode='RGB', size=(200,200), color=(255,255,255))draw = ImageDraw.Draw(img, mode='RGB')# 画点# param1: 坐标# param2: 颜色draw.point([10, 10], fill="red")draw.point([20, 10], fill=(0, 255, 255))# 画线# param1: 0,0 起始坐标 40,30结束坐标draw.line((0,0,40,30), fill=(255, 0, 0))# 画圆# param1: 起始坐标和结束坐标(圆要在期中间)# param2: 开始角度# param3: 结束角度draw.arc((50,50,100,100), 0, 90, fill=(255, 0, 0))# 写文本# param1: 起始坐标# param2:写入内容# param3:颜色draw.text([0,0], 'python', (255, 0, 0))# 特殊字体文字# param1: 字体文件路径# param2: 字体大小font = ImageFont.truetype("kumo.ttf", 28)draw.text([0,0], 'python', (255,0,0), font=font)
图片验证码
def rm_check_code(request):from io import BytesIOfrom utils.random_check_code import check_codef = BytesIO()img, code = rd_check_code()img.save(f, 'png')data = f.getvalue()request.session['code'] = codereturn HttpResponse(data)
import randomfrom PIL import Image, ImageDraw, ImageFont, ImageFilterdef check_code(width=120, height=30, char_length=5, font_file='kumo.ttf', font_size=28):code = []img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))draw = ImageDraw.Draw(img, mode='RGB')def rndChar():"""生成随机字母:return:"""return chr(random.randint(65, 90))def rndColor():"""生成随机颜色:return:"""return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))# 写文字font = ImageFont.truetype(font_file, font_size)for i in range(char_length):char = rndChar()code.append(char)h = random.randint(0, 4)draw.text([i * width / char_length, h], char, font=font, fill=rndColor())# 写干扰点for i in range(40):draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())# 写干扰圆圈for i in range(40):draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())x = random.randint(0, width)y = random.randint(0, height)draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())# 画干扰线for i in range(5):x1 = random.randint(0, width)y1 = random.randint(0, height)x2 = random.randint(0, width)y2 = random.randint(0, height)draw.line((x1, y1, x2, y2), fill=rndColor())img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)return img, ''.join(code)
