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

首頁 > 編程 > Python > 正文

python 生成圖形驗(yàn)證碼的方法示例

2020-01-04 14:05:49
字體:
供稿:網(wǎng)友

日常在網(wǎng)站使用過程中經(jīng)常遇到圖形驗(yàn)證,今天準(zhǔn)備自己做個(gè)圖形驗(yàn)證碼,這算是個(gè)簡單的功能,也適合新手練習(xí)的,便于自己學(xué)習(xí)。 

主要用到的庫--PIL圖像處理庫,簡單的思路,我們需要隨機(jī)的顏色,隨機(jī)的數(shù)字或字母,隨機(jī)的線條、點(diǎn)作為干擾元素 拼湊成一張圖片。

生成隨機(jī)顏色,返回的是rgb三色。

def getRandomColor():  r = random.randint(0, 255)  g = random.randint(0, 255)  b = random.randint(0, 255)  return (r, g, b)

從數(shù)字、大小寫字母里生成隨機(jī)字符。

def getRandomChar():  random_num = str(random.randint(0, 9))  random_lower = chr(random.randint(97, 122)) # 小寫字母a~z  random_upper = chr(random.randint(65, 90)) # 大寫字母A~Z  random_char = random.choice([random_num, random_lower, random_upper])  return random_char

圖片操作,生成一張隨機(jī)背景色的圖片,隨機(jī)生成5種字符+5種顏色,在圖片上描繪字,由于默認(rèn)的字體很小,還需要對(duì)字進(jìn)行處理,不同系統(tǒng)下的字體文件存放位置不一樣,這里我是把window下的 arial.ttf 字體復(fù)制到了當(dāng)前文件夾下直接使用的。

# 圖片寬高width = 160height = 50def createImg():  bg_color = getRandomColor()  # 創(chuàng)建一張隨機(jī)背景色的圖片  img = Image.new(mode="RGB", size=(width, height), color=bg_color)  # 獲取圖片畫筆,用于描繪字  draw = ImageDraw.Draw(img)  # 修改字體  font = ImageFont.truetype(font="arial.ttf", size=36)  for i in range(5):    # 隨機(jī)生成5種字符+5種顏色    random_txt = getRandomChar()    txt_color = getRandomColor()    # 避免文字顏色和背景色一致重合    while txt_color == bg_color:      txt_color = getRandomColor()    # 根據(jù)坐標(biāo)填充文字    draw.text((10 + 30 * i, 3), text=random_txt, fill=txt_color, font=font)  # 打開圖片操作,并保存在當(dāng)前文件夾下  with open("test.png", "wb") as f:    img.save(f, format="png")

這個(gè)時(shí)候可以看到文件夾下面的圖片

python,圖形,驗(yàn)證碼

這里是張很清晰的圖片,為了有干擾元素,這里還需要在圖片加入些線條、點(diǎn)作為干擾點(diǎn)。 

隨機(jī)畫線,在圖片寬高范圍內(nèi)隨機(jī)生成2個(gè)坐標(biāo)點(diǎn),并通過隨機(jī)顏色產(chǎn)生線條。

def drawLine(draw):  for i in range(5):    x1 = random.randint(0, width)    x2 = random.randint(0, width)    y1 = random.randint(0, height)    y2 = random.randint(0, height)    draw.line((x1, y1, x2, y2), fill=getRandomColor())

隨機(jī)畫點(diǎn),隨機(jī)生成橫縱坐標(biāo)點(diǎn)。

def drawPoint(draw):  for i in range(50):    x = random.randint(0, width)    y = random.randint(0, height)    draw.point((x,y), fill=getRandomColor())

生成方法

def createImg():  bg_color = getRandomColor()  # 創(chuàng)建一張隨機(jī)背景色的圖片  img = Image.new(mode="RGB", size=(width, height), color=bg_color)  # 獲取圖片畫筆,用于描繪字  draw = ImageDraw.Draw(img)  # 修改字體  font = ImageFont.truetype(font="arial.ttf", size=36)  for i in range(5):    # 隨機(jī)生成5種字符+5種顏色    random_txt = getRandomChar()    txt_color = getRandomColor()    # 避免文字顏色和背景色一致重合    while txt_color == bg_color:      txt_color = getRandomColor()    # 根據(jù)坐標(biāo)填充文字    draw.text((10 + 30 * i, 3), text=random_txt, fill=txt_color, font=font)  # 畫干擾線點(diǎn)  drawLine(draw)  drawPoint(draw)  # 打開圖片操作,并保存在當(dāng)前文件夾下  with open("test.png", "wb") as f:    img.save(f, format="png")

最終生成的圖片 

python,圖形,驗(yàn)證碼

這里介紹的是圖片生成的方法,可以將圖片直接顯示在前端,也可以使用接口返回url。用Django做的,需要注意的是圖片保存的路徑。

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到python教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜丰县| 英德市| 红河县| 敦煌市| 平罗县| 股票| 噶尔县| 洛宁县| 万州区| 桂平市| 大石桥市| 越西县| 当阳市| 宣汉县| 儋州市| 广河县| 安化县| 无锡市| 沂水县| 监利县| 密山市| 德昌县| 绥滨县| 高阳县| 鲁甸县| 天台县| 龙山县| 寻甸| 庆安县| 昌乐县| 胶州市| 蚌埠市| 浏阳市| 游戏| 徐州市| 大竹县| 北川| 莎车县| 宝应县| 新化县| 商城县|