python生成驗(yàn)證碼圖片代碼分享
本文實(shí)例為大家分享了python生成驗(yàn)證碼圖片代碼,分享給大家供大家參考,具體內(nèi)容如下
基本上大家使用每一種網(wǎng)絡(luò)服務(wù)都會(huì)遇到驗(yàn)證碼,一般是網(wǎng)站為了防止惡意注冊(cè)、發(fā)帖而設(shè)置的驗(yàn)證手段。其生成原理是將一串隨機(jī)產(chǎn)生的數(shù)字或符號(hào),生成一幅圖片,圖片里加上一些干擾象素(防止OCR)。下面就詳細(xì)講解如何生成驗(yàn)證碼。
所需環(huán)境
除了配置好的python環(huán)境外,還需要配有python中的PIL庫(kù),這是python中專門用來(lái)處理圖片的庫(kù)。用傳統(tǒng)的pip install 方法或者下載源碼 python setup.py install 方法安裝該庫(kù),很可能會(huì)報(bào)錯(cuò)(視運(yùn)行環(huán)境不同)。可以采用下面這個(gè)方法
- 1.下載安裝包URL,要下載支持全平臺(tái)的。
- 2.解壓縮: tar –zxv –f Imaging-1.1.7.tar.gz
- 3.進(jìn)入到解壓后的目錄: cd Imaging-1.1.7
- 4.Bulid pakage:python setup.py build_ext –i
- 5.測(cè)試:python selftest.py
- 6.安裝:python setup.py install
代碼實(shí)現(xiàn)
要生成驗(yàn)證碼圖片,我們首先要生成一個(gè)隨機(jī)字符串,包含26個(gè)字母和10個(gè)數(shù)字。
#用來(lái)隨機(jī)生成一個(gè)字符串 def gene_text(): source = list(string.letters) for index in range(0,10): source.append(str(index)) return ''.join(random.sample(source,number))#number是生成驗(yàn)證碼的位數(shù)
然后我們要?jiǎng)?chuàng)建一個(gè)圖片,寫入字符串,需要說明的這里面的字體是不同系統(tǒng)而定,如果沒有找到系統(tǒng)字體路徑的話,也可以不設(shè)置
def gene_code():
width,height = size #寬和高
image = Image.new('RGBA',(width,height),bgcolor) #創(chuàng)建圖片
font = ImageFont.truetype(font_path,25) #驗(yàn)證碼的字體和字體大小
draw = ImageDraw.Draw(image) #創(chuàng)建畫筆
text = gene_text() #生成字符串
font_width, font_height = font.getsize(text)
draw.text(((width - font_width) / number, (height - font_height) / number),text,\
font= font,fill=fontcolor) #填充字符串
接下來(lái),我們要在圖片上畫幾條干擾線
#用來(lái)繪制干擾線 def gene_line(draw,width,height): begin = (random.randint(0, width), random.randint(0, height)) end = (random.randint(0, width), random.randint(0, height)) draw.line([begin, end], fill = linecolor)
最后創(chuàng)建扭曲,加上濾鏡,用來(lái)增強(qiáng)驗(yàn)證碼的效果。
image = image.transform((width+20,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #創(chuàng)建扭曲
image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #濾鏡,邊界加強(qiáng)
image.save('idencode.png') #保存驗(yàn)證碼圖片
下面是用上述程序生成的一個(gè)驗(yàn)證碼

下面是完整的代碼:
#coding=utf-8
import random
import string
import sys
import math
from PIL import Image,ImageDraw,ImageFont,ImageFilter
#字體的位置,不同版本的系統(tǒng)會(huì)有不同
font_path = '/Library/Fonts/Arial.ttf'
#生成幾位數(shù)的驗(yàn)證碼
number = 4
#生成驗(yàn)證碼圖片的高度和寬度
size = (100,30)
#背景顏色,默認(rèn)為白色
bgcolor = (255,255,255)
#字體顏色,默認(rèn)為藍(lán)色
fontcolor = (0,0,255)
#干擾線顏色。默認(rèn)為紅色
linecolor = (255,0,0)
#是否要加入干擾線
draw_line = True
#加入干擾線條數(shù)的上下限
line_number = (1,5)
#用來(lái)隨機(jī)生成一個(gè)字符串
def gene_text():
source = list(string.letters)
for index in range(0,10):
source.append(str(index))
return ''.join(random.sample(source,number))#number是生成驗(yàn)證碼的位數(shù)
#用來(lái)繪制干擾線
def gene_line(draw,width,height):
begin = (random.randint(0, width), random.randint(0, height))
end = (random.randint(0, width), random.randint(0, height))
draw.line([begin, end], fill = linecolor)
#生成驗(yàn)證碼
def gene_code():
width,height = size #寬和高
image = Image.new('RGBA',(width,height),bgcolor) #創(chuàng)建圖片
font = ImageFont.truetype(font_path,25) #驗(yàn)證碼的字體
draw = ImageDraw.Draw(image) #創(chuàng)建畫筆
text = gene_text() #生成字符串
font_width, font_height = font.getsize(text)
draw.text(((width - font_width) / number, (height - font_height) / number),text,\
font= font,fill=fontcolor) #填充字符串
if draw_line:
gene_line(draw,width,height)
# image = image.transform((width+30,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #創(chuàng)建扭曲
image = image.transform((width+20,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #創(chuàng)建扭曲
image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #濾鏡,邊界加強(qiáng)
image.save('idencode.png') #保存驗(yàn)證碼圖片
if __name__ == "__main__":
gene_code()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)python程序設(shè)計(jì)有所幫助。
- Python生成隨機(jī)驗(yàn)證碼的兩種方法
- Python隨機(jī)生成一個(gè)6位的驗(yàn)證碼代碼分享
- python之驗(yàn)證碼生成(gvcode與captcha)
- Python生成驗(yàn)證碼實(shí)例
- Python 隨機(jī)生成中文驗(yàn)證碼的實(shí)例代碼
- python使用pil生成圖片驗(yàn)證碼的方法
- Python實(shí)現(xiàn)簡(jiǎn)單生成驗(yàn)證碼功能【基于random模塊】
- python3 pillow生成簡(jiǎn)單驗(yàn)證碼圖片的示例
- python生成隨機(jī)驗(yàn)證碼(中文驗(yàn)證碼)示例
- python生成圖片驗(yàn)證碼的方法
相關(guān)文章
通過Python的filestools庫(kù)給圖片添加全圖水印的示例詳解
這篇文章主要介紹了通過Python的filestools庫(kù)給圖片添加全圖水印,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
pycharm打包py項(xiàng)目為.exe可執(zhí)行文件的兩種方式
本文主要介紹了pycharm打包py項(xiàng)目為.exe可執(zhí)行文件的兩種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
python實(shí)現(xiàn)簡(jiǎn)易數(shù)碼時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)易數(shù)碼時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
Matplotlib實(shí)戰(zhàn)之平行坐標(biāo)系繪制詳解
平行坐標(biāo)系是一種統(tǒng)計(jì)圖表,它包含多個(gè)垂直平行的坐標(biāo)軸,每個(gè)軸表示一個(gè)字段,并用刻度標(biāo)明范圍,下面我們就來(lái)看看如何繪制平行坐標(biāo)系吧2023-08-08

