這里示范的驗(yàn)證碼都是簡(jiǎn)單的,你也可以把字符扭曲

Python第三方庫(kù)無(wú)比強(qiáng)大,PIL 是python的一個(gè)d第三方圖片處理模塊,我們也可以使用它來(lái)生成圖片驗(yàn)證碼
PIL安裝
命令安裝:
pip install pillow
下載源碼安裝:
復(fù)制地址 :https://github.com/python-pillow/Pillow
PIL使用
例子:生成圖片,并填充文字
#!/usr/bin/python#-*-coding:utf-8-*-from PIL import Image, ImageDraw, ImageFont, ImageFilter# 實(shí)例一個(gè)圖片對(duì)象240 x 60:width = 60 * 4height = 60# 圖片顏色clo = (43, 34, 88) # 我覺(jué)得是紫藍(lán)色image = Image.new('RGB', (width, height), clo)# 創(chuàng)建Font對(duì)象:# 字體文件可以使用操作系統(tǒng)的,也可以網(wǎng)上下載font = ImageFont.truetype('./font/Arial.ttf', 36)# 創(chuàng)建Draw對(duì)象:draw = ImageDraw.Draw(image)# 輸出文字:str1 = "ren ren Python"w = 4 #距離圖片左邊距離h = 10 #距離圖片上邊距離draw.text((w, h), str1, font=font)# 模糊:image.filter(ImageFilter.BLUR)code_name = 'test_code_img.jpg'save_dir = './{}'.format(code_name)image.save(save_dir, 'jpeg')print("已保存圖片: {}".format(save_dir))(venv) allenwoo@~/renren/code$ python test2.py 已保存圖片: ./test_code_img.jpg
圖片如下:

文字沒(méi)有什么色彩,我們也可以加上顏色,只需要在 text 中傳人 fill 參數(shù)就好
draw.text((w, h), str1, font=font, fill = (78, 64, 65))
隨便加的顏色

我們還可以把背景弄成很多個(gè)小點(diǎn),每隔n隔像素填充個(gè)其他顏色比如:
#!/usr/bin/python#-*-coding:utf-8-*-from PIL import Image, ImageDraw, ImageFont, ImageFilter# 實(shí)例一個(gè)圖片對(duì)象240 x 60:width = 60 * 4height = 60# 圖片顏色clo = (43, 34, 88) # 我覺(jué)得是紫藍(lán)色image = Image.new('RGB', (width, height), clo)# 創(chuàng)建Font對(duì)象:# 字體文件可以使用操作系統(tǒng)的,也可以網(wǎng)上下載font = ImageFont.truetype('./font/Arial.ttf', 36)# 創(chuàng)建Draw對(duì)象:draw = ImageDraw.Draw(image)# 填充像素:# 寬每隔 20, 高每隔5, 形成坐標(biāo)x,y# 紅色:220,20,60for x in range(0, width, 20): for y in range(0, height, 5): draw.point((x, y), fill=(220, 20, 60))# 輸出文字:str1 = "we are renren"w = 4 #距離圖片左邊距離h = 10 #距離圖片上邊距離draw.text((w, h), str1, font=font, fill = (78, 64, 65))# 模糊:image.filter(ImageFilter.BLUR)code_name = 'test_code_img.jpg'save_dir = './{}'.format(code_name)image.save(save_dir, 'jpeg')print("已保存圖片: {}".format(save_dir))結(jié)果圖片:

PIL制作驗(yàn)證碼
利用以上這些,還有我們之前學(xué)習(xí)的隨機(jī)生成器random就可以做個(gè)驗(yàn)證碼了,
生成驗(yàn)證碼代碼
#!/usr/bin/python#-*-coding:utf-8-*-from uuid import uuid1from PIL import Image, ImageDraw, ImageFont, ImageFilterimport randomdef rnd_char(): ''' 隨機(jī)一個(gè)字母或者數(shù)字 :return: ''' # 隨機(jī)一個(gè)字母或者數(shù)字 i = random.randint(1,3) if i == 1: # 隨機(jī)個(gè)數(shù)字的十進(jìn)制ASCII碼 an = random.randint(97, 122) elif i == 2: # 隨機(jī)個(gè)小寫字母的十進(jìn)制ASCII碼 an = random.randint(65, 90) else: # 隨機(jī)個(gè)大寫字母的十進(jìn)制ASCII碼 an = random.randint(48, 57) # 根據(jù)Ascii碼轉(zhuǎn)成字符,return回去 return chr(an)# 干擾def rnd_dis(): ''' 隨機(jī)一個(gè)干擾字 :return: ''' d = ['^','-', '~', '_', '.'] i = random.randint(0, len(d)-1) return d[i]# 兩個(gè)隨機(jī)顏色都規(guī)定不同的區(qū)域,防止干擾字符和驗(yàn)證碼字符顏色一樣# 隨機(jī)顏色1:def rnd_color(): ''' 隨機(jī)顏色,規(guī)定一定范圍 :return: ''' return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))# 隨機(jī)顏色2:def rnd_color2(): ''' 隨機(jī)顏色,規(guī)定一定范圍 :return: ''' return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))def create_code(): # 240 x 60: width = 60 * 4 height = 60 image = Image.new('RGB', (width, height), (192, 192, 192)) # 創(chuàng)建Font對(duì)象: font = ImageFont.truetype('./font/Arial.ttf', 36) # 創(chuàng)建Draw對(duì)象: draw = ImageDraw.Draw(image) # 填充每個(gè)像素: for x in range(0, width, 20): for y in range(0, height, 10): draw.point((x, y), fill=rnd_color()) # 填充字符 _str = "" # 填入4個(gè)隨機(jī)的數(shù)字或字母作為驗(yàn)證碼 for t in range(4): c = rnd_char() _str = "{}{}".format(_str, c) # 隨機(jī)距離圖片上邊高度,但至少距離30像素 h = random.randint(1, height-30) # 寬度的化,每個(gè)字符占圖片寬度1/4,在加上10個(gè)像素空隙 w = width/4 * t + 10 draw.text((w, h), c, font=font, fill=rnd_color2()) # 實(shí)際項(xiàng)目中,會(huì)將驗(yàn)證碼 保存在數(shù)據(jù)庫(kù),并加上時(shí)間字段 print("保存驗(yàn)證碼 {} 到數(shù)據(jù)庫(kù)".format(_str)) # 給圖片加上字符干擾,密集度由 w, h控制 for j in range(0, width, 30): dis = rnd_dis() w = t * 15 + j # 隨機(jī)距離圖片上邊高度,但至少距離30像素 h = random.randint(1, height - 30) draw.text((w, h), dis, font=font, fill=rndColor()) # 模糊: image.filter(ImageFilter.BLUR) # uuid1 生成唯一的字符串作為驗(yàn)證碼圖片名稱 code_name = '{}.jpg'.format(uuid1()) save_dir = './{}'.format(code_name) image.save(save_dir, 'jpeg') print("已保存圖片: {}".format(save_dir))# 當(dāng)直接運(yùn)行文件的是和,運(yùn)行下面代碼if __name__ == "__main__": create_code()(venv) allenwoo@~/renren/code$ python test.py 保存驗(yàn)證碼 ef3k 到數(shù)據(jù)庫(kù)已保存圖片: ./c86e03c0-1c23-11e7-999d-f45c89c09e61.jpg(venv) allenwoo@~/renren/code$ python test.py 保存驗(yàn)證碼 I37X 到數(shù)據(jù)庫(kù)已保存圖片: ./cb8aed02-1c23-11e7-9b18-f45c89c09e61.jpg(venv) allenwoo@~/renren/code$ python test.py 保存驗(yàn)證碼 vVL1 到數(shù)據(jù)庫(kù)已保存圖片: ./cc120da8-1c23-11e7-b762-f45c89c09e61.jpg(venv) allenwoo@~/renren/code$ python test.py 保存驗(yàn)證碼 K6w3 到數(shù)據(jù)庫(kù)已保存圖片: ./cc891e05-1c23-11e7-b7ec-f45c89c09e61.jpg




你覺(jué)得難不難呢?最后這個(gè)生成驗(yàn)證碼代碼中有些邏輯問(wèn)題要理解下
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選