筆者用的是python3舷礼、pillow4.2.1版本蛛株。
pillow庫文件里笋粟,用到了Image,ImageDraw,ImageFont,Imagefilter模塊。
這個項(xiàng)目還用到了random模塊。
在python2里用來實(shí)現(xiàn)圖像處理的庫pil盾沫,并不兼容python3绞幌,但是3里有一個出自pil的庫文件pillow可以供使用。
一、分析生成驗(yàn)證碼步驟
人們?nèi)粘I钪芯厦迹?jīng)常會見到并且用到驗(yàn)證碼哗戈,驗(yàn)證碼荷科,通常是由具有顏色的扭曲的字符串加上極具干擾的背景組成。
因此,我在這里把驗(yàn)證碼分為四塊瞎嬉,基礎(chǔ)圖片便监、干擾背景、驗(yàn)證碼字符串、濾鏡巷嚣。
1.基礎(chǔ)圖片
我們先定義一張圖片涤姊,用以表達(dá)驗(yàn)證碼。
圖片顏色是用RGB顏色模式。
RGB色彩值,通過對紅文兑、藍(lán)涡上、綠進(jìn)行隨機(jī)定值后雁佳,體現(xiàn)具體的顏色旱易,定值范圍為0~255全释,也就是說,能夠有1600萬種顏色黔州。
2.干擾背景
我在這個腳本里,無腦選擇了直線和點(diǎn)作為干擾的背景浑度。(暫時想不到什么因素可以作為干擾背景……)
3.驗(yàn)證碼字符串
字符串包括了所有的英文大小寫和個位數(shù)字谨设。
在這里二蓝,驗(yàn)證碼包括了隨機(jī)的五位字符串踊跟。
4.濾鏡
通過設(shè)置濾鏡以及其扭曲程度拳昌,我們可以扭曲圖片炬藤。
圖片的扭曲方式總共分兩大方面:水平和垂直细睡。水平包括了縮放蠢壹、傾斜和位移。垂直也包括了縮放、傾斜和位移。
二跪者、具體代碼
我們先定義一張圖片棵帽,以用來作為一塊畫板。
代碼:
img = Image.new("RGB",(150,50),(255,255,255))
作用:
第一個參數(shù):代表采用RGB顏色模式
第二個參數(shù):代表圖片大小 150 x 50
第三個參數(shù):具體的圖片顏色
至此渣玲,畫板我們已經(jīng)構(gòu)造好了逗概,接下來,我們需要一只畫筆忘衍。
代碼:
draw = ImageDraw.Draw(img)
畫筆和畫板都已經(jīng)準(zhǔn)備好了逾苫,我們接下來需要在這個畫板上繪制一些由線條和點(diǎn)構(gòu)成的干擾背景。
代碼:
#繪制線條
#線條是由兩個定點(diǎn)連接成的線枚钓,對于二維背景圖來說铅搓,每個點(diǎn)都由(x,y)兩個坐標(biāo)值來確定位置搀捷。
for i in range(random.randint(1,10)):
draw.line(
[
(random.randint(1,150),random.randint(1,150)),
(random,randint(1,150),random.randint(1,150))
],
fill = (0,0,0)
)
#繪制點(diǎn)
for i in range(1000):
draw.point(
[
random.randint(1,150),
random.randint(1,150)
],
fill = (0,0,0)
)
只剩下需要被識別的字符串了星掰。
代碼:
#定義所要生成隨機(jī)數(shù)的范圍:字母和數(shù)字
font_list = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
c_chars = "".join(random.randint(font_list,5))
#繪制字體
font = ImageFont.truetype("simsun.ttc",35)
draw.text((5,5),c_chars,font = font, fill = "green")
#第一個參數(shù):代表文字的位置,距離上和左的距離
#第二個參數(shù):代表文字的內(nèi)容
#第三個參數(shù):代表字體
#第四個參數(shù):代表字體顏色
最后我們需要定義扭曲的參數(shù)從而添加并且使用濾鏡嫩舟。
代碼:
#定義扭曲的參數(shù)
params = [1 - float(random.randint(1,2))/100,
0,
0,
0,
1 - float(random.randint(1,2))/100,
float(random.randint(1,2))/500,
0.001,
float(random.randint(1,1))/500,
]
#使用濾鏡
#添加濾鏡
img = img.transform((150,50),Image.PRESPECTIVE,params)
#第一個參數(shù):扭曲的范圍
#第二個參數(shù):扭曲的樣式
#第三個參數(shù):扭曲的參數(shù)
#進(jìn)行扭曲
img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
最后將產(chǎn)生的圖片輸出顯示氢烘。
代碼:
img.show()
效果圖如下:
PS:每天催眠自己,告誡自己一定要堅持學(xué)習(xí)家厌,或許在不久的將來就可以改變現(xiàn)狀了播玖!