達成するためにCAPTCHAの画像

  。1つの !は/ usr / binに/ envをPythonの
  2  - * -コーディング:UTF-8 - * - 
  。3  
  。4  インポートランダム
   。5  から PIL インポート画像、ImageDraw、ImageFont、のImageFilter
   。6  
  。7 _letter_cases = " abcdefghjkmnpqrstuvwxy "   #を削除小文字可能な干渉I、L、O、Z 
  8 _upper_cases _letter_cases.upper =()  大文字
  。9 _numbers = '' .join(MAP(STR、範囲(3、10)))  
10 init_chars = '' .join ((_letter_cases、_upper_cases、_numbers))
 11 
12  
13  デフ create_validate_code(サイズ=(120、30 )、
 14                           文字= init_chars、
 15                           img_type = " GIF " 16                           モード= " RGB " 17                           BG_COLOR =(255、255、255 )、
 18                           fg_color =(0,0 、255 )、
 19                           FONT_SIZE = 18 20                           font_type = " Monaco.ttf " 21                          4 =長さ22は                           draw_lines = 、真
 23は                           n_line =(1、2 24                           draw_points = 真、
 25                           point_chance = 2 ):
 26は     "" " 
27      に確認コード画像生成:@todo
 28      @paramサイズ:画像のサイズ、フォーマット(幅、高さ)、デフォルトでは(120、30)である
 29      許可される文字の集合、フォーマット文字列:@paramの文字
 30      @paramのimg_type:画像の保存形式、GIFのための任意のGIF、JPEG、TIFFのデフォルト、PNG
 31は     @paramモード:RGBの画像モード既定
 32      @param BG_COLOR:背景色は、デフォルトは白
 33     @paramのfg_color:前景の色、文字の色コード、デフォルトブルー0000FF#
 34は     @paramのFONT_SIZE:フォントサイズコード
 35      @paramのfont_type:フォントコード、デフォルトae_AlArabiya.ttf
 36      @param長さ:1つの文字コード数
 37 [      @param draw_lines:干渉ドローラインかどうか
 38である     真draw_linesにのみ有効条干渉回線番号の範囲、タプル形式、デフォルト(1、2)、:@param n_lines
 39      干渉ビデオのポイントかどうか:@paramのdraw_points
 40      @paramのpoint_chance:干渉点の発生確率、範囲のサイズ[0、100]
 41である     @return:[0]:PIL画像例
 42は、     @return:[1]:検証コード画像列
 43は     " "" 
44は 
45      幅、=高さサイズ   #の幅と高さ
46      グラフィック作成する
47     = IMG Image.new(MODE、サイズ、BG_COLOR)
 48      描画= ImageDraw.Draw(IMG)  ブラシの作成
49  
50      DEF GET_CHARS():
 51は         "" " 与えられた長さのために生成された文字列は、リスト形式を返す""" 
52          戻りrandom.sample(文字、長さ)
 53は、 
54である     DEF create_lines():
 55          "" " ライン干渉を描く" "" 
56れる          LINE_NUM random.randint =(* n_line)   #1 回線の干渉番号
57は 
58          のための I レンジ(LINE_NUM):
 59              開始点
60             =(random.randint(0、サイズ[0])、random.randint(0、サイズを[1始める]))
 61である             エンドポイント
62で              終了=(random.randint(0、サイズ[0])、random.randint (0、サイズ[1 ]))
 63である              draw.line([開始、終了]、塗りつぶし= (0、0、0))
 64  
65      DEFのcreate_points():
 66          "" " 描画干渉点" "" 
67          チャンス=分(100、MAX(0、INT(point_chance)))  サイズ制限[0、100] 
68  
69          のために W レンジ(幅):
 70              のための H における範囲(高さ):
 71のIS                 random.randint = TMP(0、100 72                  IF TMP> 100 - チャンス:
 73である                      draw.point((W、H)、フィル= (0、0、0))
 74  
75      DEFのcreate_strs():
 76          "" " 文字コードレンダリング"" " 
77          c_chars = GET_CHARS()
 78件          のSTRを= ' %S ''  ' .join(c_chars)  各文字がスペースで区切られた後
79  
80          フォント= ImageFont.truetype(font_type、FONT_SIZE)
 81          font_width、font_height =font.getsize(STRS)
 82  
83          draw.text(((幅- font_width)/ 3、(高- font_height)/ 3 )、
 84                    STRS、フォント=フォント、フィル= fg_color)
 85  
86          リターン '' .join(c_chars )
 87  
88      ならdraw_lines:
 89          create_lines()
 90      ならdraw_points:
 91          create_points()
 92      STRS = create_strs()
 93  
94      图形扭曲参数
95件      のparams = [1 -フロート(random.randint(1、2))/ 100 96               0、
 97                0、
 98                0、
 99                1 -フロート(random.randint(1、10)。)/ 100 100                フロート(random.randint(1、2)。)/ 500 101                0.001から102                フロート(random.randint( 。1、2))/ 500
 103                ]
 104      IMG = img.transform(サイズ、Image.PERSPECTIVE、paramsは)   #は、歪みを作成する
105  
106      IMG = img.filter(ImageFilter.EDGE_ENHANCE_MORE)   #1 )境界(より高い閾値を強化、フィルタ
107  
108      リターン IMG、STRを

どのように使用するには:

1  生成验证码图片
2  DEF get_check_code(リクエスト):
 3      = F BytesIO()
 4      IMG、コード= check_code.create_validate_code()
 5      ますrequest.session [ " check_code " = コード
 6      img.save(F、" PNG " 7      リターンのHttpResponse(f.getvalue())

フロントエンドの認証コードをクリックしてイベントを交換するには画像をクリックしてください:

1つの     関数reload_check_code(TH){
 2          th.src = th.src + " " 3      }

おすすめ

転載: www.cnblogs.com/sun-10387834/p/12537561.html