python圖片驗(yàn)證碼生成代碼
本文實(shí)例為大家分享了python圖片驗(yàn)證碼實(shí)現(xiàn)代碼,供大家參考,具體內(nèi)容如下
#!/usr/bin/env python # -*- coding: UTF-8 -*- import random from PIL import Image, ImageDraw, ImageFont, ImageFilter try: import cStringIO as StringIO except ImportError: import StringIO _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小寫字母 _upper_cases = "ABCDEFGHJKLMNPQRSTUVWXY" # 大寫字母 _numbers = "1234567890" # 數(shù)字 init_chars = ''.join((_letter_cases, _upper_cases, _numbers)) # 生成允許的字符集合 default_font = "./DejaVuSans.ttf" # 驗(yàn)證碼字體 # 生成驗(yàn)證碼接口 def generate_verify_image(size=(120, 30), chars=init_chars, img_type="GIF", mode="RGB", bg_color=(255, 255, 255), fg_color=(0, 0, 255), font_size=18, font_type=default_font, length=4, draw_lines=True, n_line=(1, 2), draw_points=True, point_chance=2, save_img=False): """ 生成驗(yàn)證碼圖片 :param size: 圖片的大小,格式(寬,高),默認(rèn)為(120, 30) :param chars: 允許的字符集合,格式字符串 :param img_type: 圖片保存的格式,默認(rèn)為GIF,可選的為GIF,JPEG,TIFF,PNG :param mode: 圖片模式,默認(rèn)為RGB :param bg_color: 背景顏色,默認(rèn)為白色 :param fg_color: 前景色,驗(yàn)證碼字符顏色,默認(rèn)為藍(lán)色#0000FF :param font_size: 驗(yàn)證碼字體大小 :param font_type: 驗(yàn)證碼字體,默認(rèn)為 DejaVuSans.ttf :param length: 驗(yàn)證碼字符個(gè)數(shù) :param draw_lines: 是否劃干擾線 :param n_line: 干擾線的條數(shù)范圍,格式元組,默認(rèn)為(1, 2),只有draw_lines為True時(shí)有效 :param draw_points: 是否畫干擾點(diǎn) :param point_chance: 干擾點(diǎn)出現(xiàn)的概率,大小范圍[0, 100] :param save_img: 是否保存為圖片 :return: [0]: 驗(yàn)證碼字節(jié)流, [1]: 驗(yàn)證碼圖片中的字符串 """ width, height = size # 寬, 高 img = Image.new(mode, size, bg_color) # 創(chuàng)建圖形 draw = ImageDraw.Draw(img) # 創(chuàng)建畫筆 def get_chars(): """生成給定長度的字符串,返回列表格式""" return random.sample(chars, length) def create_lines(): """繪制干擾線""" line_num = random.randint(*n_line) # 干擾線條數(shù) for i in range(line_num): # 起始點(diǎn) begin = (random.randint(0, size[0]), random.randint(0, size[1])) # 結(jié)束點(diǎn) end = (random.randint(0, size[0]), random.randint(0, size[1])) draw.line([begin, end], fill=(0, 0, 0)) def create_points(): """繪制干擾點(diǎn)""" chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100] for w in xrange(width): for h in xrange(height): tmp = random.randint(0, 100) if tmp > 100 - chance: draw.point((w, h), fill=(0, 0, 0)) def create_strs(): """繪制驗(yàn)證碼字符""" c_chars = get_chars() strs = ' %s ' % ' '.join(c_chars) # 每個(gè)字符前后以空格隔開 font = ImageFont.truetype(font_type, font_size) font_width, font_height = font.getsize(strs) draw.text(((width - font_width) / 3, (height - font_height) / 3), strs, font=font, fill=fg_color) return ''.join(c_chars) if draw_lines: create_lines() if draw_points: create_points() strs = create_strs() # 圖形扭曲參數(shù) params = [1 - float(random.randint(1, 2)) / 100, 0, 0, 0, 1 - float(random.randint(1, 10)) / 100, float(random.randint(1, 2)) / 500, 0.001, float(random.randint(1, 2)) / 500 ] img = img.transform(size, Image.PERSPECTIVE, params) # 創(chuàng)建扭曲 img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 濾鏡,邊界加強(qiáng)(閾值更大) mstream = StringIO.StringIO() img.save(mstream, img_type) if save_img: img.save("validate.gif", img_type) return mstream, strs if __name__ == "__main__": mstream, strs = generate_verify_image(save_img=True) print strs
以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Django定制Admin頁面詳細(xì)實(shí)例(展示頁面和編輯頁面)
django自帶的admin因?yàn)楣δ芎蜆邮奖容^簡陋,常常需要再次定制,下面這篇文章主要給大家介紹了關(guān)于Django定制Admin頁面(展示頁面和編輯頁面)的相關(guān)資料,需要的朋友可以參考下2023-06-06python使用datetime模塊處理日期時(shí)間及常用功能詳解
datetime模塊是Python標(biāo)準(zhǔn)庫中用于處理日期和時(shí)間的模塊,在本節(jié)中,我們將介紹datetime模塊的一些常用功能,并通過實(shí)例代碼詳細(xì)講解每個(gè)知識點(diǎn),有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-06-06python輸出第n個(gè)默尼森數(shù)的實(shí)現(xiàn)示例
這篇文章主要介紹了python輸出第n個(gè)默尼森數(shù)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Python庫Theano深度神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì)訓(xùn)練深入探究
Theano是一個(gè)用于深度學(xué)習(xí)的Python庫,它提供了高效的數(shù)值計(jì)算和自動微分功能,使得深度神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì)和訓(xùn)練變得更加容易,本文將深入探討Theano的功能和用法,并提供豐富的示例代碼,幫助大家入門深度學(xué)習(xí)2024-01-01詳談python中subprocess shell=False與shell=True的區(qū)別
這篇文章主要介紹了詳談python中subprocess shell=False與shell=True的區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04Python requests.post()方法中data和json參數(shù)的使用方法
這篇文章主要介紹了Python requests.post()方法中data和json參數(shù)的使用方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-08-08