国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python簡(jiǎn)單的制作圖片驗(yàn)證碼實(shí)例

2019-11-25 16:08:14
字體:
供稿:網(wǎng)友

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


Python第三方庫(kù)無比強(qiáng)大,PIL 是python的一個(gè)d第三方圖片處理模塊,我們也可以使用它來生成圖片驗(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) # 我覺得是紫藍(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

圖片如下:

文字沒有什么色彩,我們也可以加上顏色,只需要在 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) # 我覺得是紫藍(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




你覺得難不難呢?最后這個(gè)生成驗(yàn)證碼代碼中有些邏輯問題要理解下

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安多县| 礼泉县| 台湾省| 深水埗区| 玉溪市| 黄冈市| 翁牛特旗| 容城县| 武清区| 九龙县| 政和县| 龙陵县| 新余市| 句容市| 鄂伦春自治旗| 莎车县| 逊克县| 淮滨县| 昌宁县| 贵阳市| 博乐市| 疏附县| 姚安县| 中江县| 开阳县| 崇左市| 钟山县| 祁阳县| 深水埗区| 庄浪县| 璧山县| 祁东县| 商都县| 那曲县| 梅河口市| 定西市| 兰溪市| 吴川市| 舟曲县| 山西省| 利辛县|