|
| 1 | +#-*- coding: utf-8-*- |
| 2 | + |
| 3 | +# Source:https://github.com/Show-Me-the-Code/show-me-the-code |
| 4 | +# Author:Burness Duan |
| 5 | +# Date:2014-12-29 |
| 6 | +# Python 3.3 |
| 7 | + |
| 8 | + |
| 9 | +import random |
| 10 | +import string |
| 11 | +from PIL import Image, ImageDraw, ImageFont, ImageFilter |
| 12 | + |
| 13 | + |
| 14 | +def random_string(y): |
| 15 | + ''' |
| 16 | + 生成指定长度的随机字符串 |
| 17 | + ''' |
| 18 | + return ''.join(random.choice(string.ascii_letters) for x in range(y)) |
| 19 | + |
| 20 | + |
| 21 | +def create_verifi_image(strs, |
| 22 | + size=(120, 30), |
| 23 | + img_type = 'jpg', |
| 24 | + mode = 'RGB', |
| 25 | + bg_color= (255, 255, 255), |
| 26 | + fg_color = (0, 0, 255), |
| 27 | + font_size =18, |
| 28 | + font_type = 'ahronbd.ttf', |
| 29 | + draw_lines=True, |
| 30 | + n_line=(1, 2), |
| 31 | + draw_points=True, |
| 32 | + point_chance = 2, |
| 33 | + ): |
| 34 | + |
| 35 | + width, height = size |
| 36 | + img = Image.new(mode, size, bg_color) |
| 37 | + draw = ImageDraw.Draw(img) |
| 38 | + if draw_lines: |
| 39 | + line_num = random.randint(*n_line) |
| 40 | + for i in range(line_num): |
| 41 | + begin = (random.randint(0, size[0]), random.randint(0, size[1])) |
| 42 | + end = (random.randint(0, size[0]), random.randint(0, size[1])) |
| 43 | + draw.line([begin, end], fill=(0, 0, 0)) |
| 44 | + |
| 45 | + if draw_points: |
| 46 | + chance = min(100, max(0, int(point_chance))) |
| 47 | + for w in range(width): |
| 48 | + for h in range(height): |
| 49 | + tmp = random.randint(0,100) |
| 50 | + if tmp >100 -chance: |
| 51 | + draw.point((w,h),fill =(0,0,0)) |
| 52 | + font = ImageFont.truetype(font_type, font_size) |
| 53 | + font_width, font_height = font.getsize(strs) |
| 54 | + draw.text(((width-font_width)/3,(height-font_height)/3),strs,font=font, fill=fg_color) |
| 55 | + params = [1 - float(random.randint(1, 2)) / 100, 0, 0, 0, 1 - float(random.randint(1, 10)) / 100, |
| 56 | + float(random.randint(1, 2)) / 500, |
| 57 | + 0.001, |
| 58 | + float(random.randint(1, 2)) / 500 |
| 59 | + ] |
| 60 | + img = img.transform(size, Image.PERSPECTIVE, params) |
| 61 | + img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) |
| 62 | + return img |
| 63 | + |
| 64 | + |
| 65 | +if __name__ == '__main__': |
| 66 | + strs = random_string(4) |
| 67 | + code_img = create_verifi_image(strs) |
| 68 | + code_img.show() |
| 69 | + code_img.save('validate.jpg') |
| 70 | + |
| 71 | + |
| 72 | + |
| 73 | + |
0 commit comments