python生成驗證碼圖片代碼分享
本文實例為大家分享了python生成驗證碼圖片代碼,分享給大家供大家參考,具體內(nèi)容如下
基本上大家使用每一種網(wǎng)絡(luò)服務(wù)都會遇到驗證碼,一般是網(wǎng)站為了防止惡意注冊、發(fā)帖而設(shè)置的驗證手段。其生成原理是將一串隨機產(chǎn)生的數(shù)字或符號,生成一幅圖片,圖片里加上一些干擾象素(防止OCR)。下面就詳細講解如何生成驗證碼。
所需環(huán)境
除了配置好的python環(huán)境外,還需要配有python中的PIL庫,這是python中專門用來處理圖片的庫。用傳統(tǒng)的pip install 方法或者下載源碼 python setup.py install 方法安裝該庫,很可能會報錯(視運行環(huán)境不同)??梢圆捎孟旅孢@個方法
- 1.下載安裝包URL,要下載支持全平臺的。
- 2.解壓縮: tar –zxv –f Imaging-1.1.7.tar.gz
- 3.進入到解壓后的目錄: cd Imaging-1.1.7
- 4.Bulid pakage:python setup.py build_ext –i
- 5.測試:python selftest.py
- 6.安裝:python setup.py install
代碼實現(xiàn)
要生成驗證碼圖片,我們首先要生成一個隨機字符串,包含26個字母和10個數(shù)字。
#用來隨機生成一個字符串 def gene_text(): source = list(string.letters) for index in range(0,10): source.append(str(index)) return ''.join(random.sample(source,number))#number是生成驗證碼的位數(shù)
然后我們要創(chuàng)建一個圖片,寫入字符串,需要說明的這里面的字體是不同系統(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) #驗證碼的字體和字體大小 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) #填充字符串
接下來,我們要在圖片上畫幾條干擾線
#用來繪制干擾線 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)建扭曲,加上濾鏡,用來增強驗證碼的效果。
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) #濾鏡,邊界加強 image.save('idencode.png') #保存驗證碼圖片
下面是用上述程序生成的一個驗證碼
下面是完整的代碼:
#coding=utf-8 import random import string import sys import math from PIL import Image,ImageDraw,ImageFont,ImageFilter #字體的位置,不同版本的系統(tǒng)會有不同 font_path = '/Library/Fonts/Arial.ttf' #生成幾位數(shù)的驗證碼 number = 4 #生成驗證碼圖片的高度和寬度 size = (100,30) #背景顏色,默認為白色 bgcolor = (255,255,255) #字體顏色,默認為藍色 fontcolor = (0,0,255) #干擾線顏色。默認為紅色 linecolor = (255,0,0) #是否要加入干擾線 draw_line = True #加入干擾線條數(shù)的上下限 line_number = (1,5) #用來隨機生成一個字符串 def gene_text(): source = list(string.letters) for index in range(0,10): source.append(str(index)) return ''.join(random.sample(source,number))#number是生成驗證碼的位數(shù) #用來繪制干擾線 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) #生成驗證碼 def gene_code(): width,height = size #寬和高 image = Image.new('RGBA',(width,height),bgcolor) #創(chuàng)建圖片 font = ImageFont.truetype(font_path,25) #驗證碼的字體 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) #濾鏡,邊界加強 image.save('idencode.png') #保存驗證碼圖片 if __name__ == "__main__": gene_code()
以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)python程序設(shè)計有所幫助。
相關(guān)文章
Python使用DPKT實現(xiàn)分析數(shù)據(jù)包
dpkt項目是一個Python模塊,主要用于對網(wǎng)絡(luò)數(shù)據(jù)包進行解析和操作,z這篇文章主要為大家介紹了python如何利用DPKT實現(xiàn)分析數(shù)據(jù)包,有需要的可以參考下2023-10-10Python利用sched模塊實現(xiàn)定時任務(wù)
今天我們來介紹一下Python當中的定時任務(wù),主要用到的模塊是sched,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-04-04Python 代碼實現(xiàn)列表的最小公倍數(shù)
這篇文章主要介紹了Python 代碼實現(xiàn)列表的最小公倍數(shù),代碼實現(xiàn)了計算列表中元素的最小公倍數(shù)的功能,包括公式介紹,需要的朋友可以參考一下2021-11-11Django防御csrf攻擊的實現(xiàn)方式(包括ajax請求)
這篇文章主要介紹了Django防御csrf攻擊的實現(xiàn)方式(包括ajax請求),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09