Python利用Pillow(PIL)庫(kù)實(shí)現(xiàn)驗(yàn)證碼圖片的全過(guò)程
前言
Pillow庫(kù)有很多用途,本文使用Pillow來(lái)生成隨機(jī)的驗(yàn)證碼圖片。
Pillow的用法參考:http://www.dbjr.com.cn/article/196007.htm
驗(yàn)證碼是隨機(jī)的,使用Python內(nèi)置的random庫(kù)來(lái)生成隨機(jī)的顏色和隨機(jī)的字符。
random的用法參考:http://www.dbjr.com.cn/article/196955.htm
一、驗(yàn)證碼圖片的效果
# coding=utf-8 import random from PIL import Image, ImageDraw, ImageFont width, height, font_size, font_num = 300, 100, 48, 5 bg_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) image = Image.new(mode='RGB', size=(width, height), color=bg_color) draw = ImageDraw.Draw(image, mode='RGB') font = ImageFont.truetype("C:\Windows\Fonts\Arial.ttf", font_size) verify = str() for i in range(font_num): x = random.randint(i*(width/font_num), (i+1)*(width/font_num)-font_size) y = random.randint(0, height-font_size) char = random.choice([chr(alpha) for alpha in range(65, 91)] + [str(num) for num in range(10)]) verify += char color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) draw.text((x, y), char, fill=color, font=font) print(verify) image.show()
運(yùn)行結(jié)果:
KG7CQ
二、使用的方法介紹
上面的代碼已經(jīng)實(shí)現(xiàn)了生成隨機(jī)驗(yàn)證碼的功能,現(xiàn)在介紹代碼中用到的函數(shù)和方法。
Image.new(): Image模塊中的new()函數(shù),創(chuàng)建一張圖片(畫(huà)布),用于繪圖。傳入3個(gè)參數(shù),畫(huà)布的模式('RGB'表示真彩圖片)、尺寸和顏色,畫(huà)布的顏色就是驗(yàn)證碼中的背景顏色。
ImageDraw.Draw(): ImageDraw模塊中的Draw()函數(shù),實(shí)例化一個(gè)ImageDraw類(lèi)的對(duì)象draw,執(zhí)行繪圖。傳入兩個(gè)參數(shù),畫(huà)布和繪圖的模式,畫(huà)布使用前面Image.new()創(chuàng)建的畫(huà)布,模式繼續(xù)使用'RGB'真彩模式。Draw()函數(shù)會(huì)將傳入的兩個(gè)參數(shù)傳給ImageDraw類(lèi),實(shí)例化一個(gè)類(lèi)對(duì)象并返回,以便后面使用類(lèi)對(duì)象draw調(diào)用對(duì)應(yīng)的方法執(zhí)行繪圖,使用draw對(duì)象將驗(yàn)證碼中的字符畫(huà)在畫(huà)布上。
ImageFont.truetype(): ImageFont模塊中的truetype()函數(shù),從字體文件或字體對(duì)象中讀取字體并返回一個(gè)字體對(duì)象。傳入兩個(gè)參數(shù),字體文件(或字體對(duì)象)和字體大小。字體只能使用當(dāng)前電腦支持的字體,在Windows系統(tǒng)中,已安裝的字體一般都保存在C:\Windows\Fonts文件夾中,如上面代碼中的C:\Windows\Fonts\Arial.ttf,應(yīng)該每個(gè)人都默認(rèn)安裝了,在代碼中一定要帶上擴(kuò)展名'.ttf',否則讀取不到字體文件。如果字體不在Windows\Fonts這個(gè)目錄下,可以在控制面板找或直接在所有文件中搜索Fonts。字體大小傳入一個(gè)數(shù)字即可。
random模塊中的randint()和choice()。在上面的代碼中,randint()用于隨機(jī)生成顏色值,隨機(jī)生成字符在畫(huà)布上的x和y坐標(biāo)。choice()用于從26個(gè)大寫(xiě)字母(chr字符集中65~90為26個(gè)大寫(xiě)字母)和數(shù)字中隨機(jī)選擇一個(gè)字符。
text(): ImageDraw模塊的ImageDraw類(lèi)的方法,使用ImageDraw.Draw()返回的類(lèi)對(duì)象draw來(lái)調(diào)用,將字符畫(huà)到畫(huà)布上。text()方法有12個(gè)參數(shù),并且還可以接收其他的可變參數(shù)和關(guān)鍵字參數(shù),不過(guò)只有兩個(gè)必傳參數(shù),上面的代碼中也只傳了4個(gè)參數(shù),所以其他的參數(shù)就不做介紹了。第一個(gè)必傳參數(shù)是xy,傳入一個(gè)元組或列表,表示字符畫(huà)到畫(huà)布上的位置坐標(biāo)(字符左上角),第二個(gè)必傳參數(shù)是text,傳入一個(gè)字符串,表示需要畫(huà)的字符。上面還傳了兩個(gè)參數(shù)fill和font,fill表示字符的顏色,傳入一個(gè)隨機(jī)的顏色,font表示字符的字體,傳入用ImageFont.truetype()函數(shù)返回的字體對(duì)象。
循環(huán)將每次隨機(jī)生成的字符繪畫(huà)到畫(huà)布上,再使用image對(duì)象的show()方法將圖片顯示出來(lái),隨機(jī)的驗(yàn)證碼圖片就生成成功了。
三、優(yōu)化封裝
import random from PIL import Image, ImageDraw, ImageFont def gen_verified_image(): width, height, font_size, font_num = 400, 150, 48, 4 bg_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) image = Image.new(mode='RGB', size=(width, height), color=bg_color) draw = ImageDraw.Draw(image, mode='RGB') font = ImageFont.truetype("C:\Windows\Fonts\Gadugi.ttf", font_size) verify = str() for i in range(font_num): x = random.randint(i * (width / font_num) + 10, (i + 1) * (width / font_num) - font_size - 10) y = random.randint(20, height - font_size - 20) char = random.choice([chr(a) for a in range(65, 91)] + [chr(b) for b in range(97, 123)] + [str(num) for num in range(10)]) verify += char color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) draw.text((x, y), char, fill=color, font=font) return image, verify if __name__ == '__main__': image, verify = gen_verified_image() print(verify) image.show()
運(yùn)行結(jié)果:
qtC7
驗(yàn)證碼的字體一般不會(huì)使用很容易辨認(rèn)的字體,可以換一個(gè)復(fù)雜一點(diǎn)的。除了大寫(xiě)字母之外,也可以把小寫(xiě)字母加進(jìn)來(lái)。調(diào)整字符的位置避免畫(huà)到畫(huà)布的邊緣。將代碼封裝到一個(gè)函數(shù)中,并將image對(duì)象和驗(yàn)證碼字符verify作為返回值,方便調(diào)用時(shí)展示圖片和進(jìn)行驗(yàn)證。
總結(jié)
到此這篇關(guān)于Python利用Pillow(PIL)庫(kù)實(shí)現(xiàn)驗(yàn)證碼圖片的文章就介紹到這了,更多相關(guān)Python用Pillow(PIL)庫(kù)驗(yàn)證碼圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)批量提取word文件中文本框內(nèi)容
在日常的辦公中,有時(shí)需要提取多個(gè)word文件中的文字框的內(nèi)容,這篇文章主要為大家介紹了三種常見(jiàn)的方法來(lái)提取文本框的內(nèi)容,希望對(duì)大家有一定的幫助2024-02-02Pytorch的torch.utils.data中Dataset以及DataLoader示例詳解
torch.utils.data?是?PyTorch?提供的一個(gè)模塊,用于處理和加載數(shù)據(jù),該模塊提供了一系列工具類(lèi)和函數(shù),用于創(chuàng)建、操作和批量加載數(shù)據(jù)集,這篇文章主要介紹了Pytorch的torch.utils.data中Dataset以及DataLoader等詳解,需要的朋友可以參考下2023-08-08Python中的tkinter庫(kù)簡(jiǎn)單案例詳解
tkinter?是?Python?的標(biāo)準(zhǔn)?GUI?庫(kù),Python?使用?tkinter?可以快速的創(chuàng)建?GUI?應(yīng)用程序,今天通過(guò)本文給大家分享Python中的tkinter庫(kù)簡(jiǎn)單案例詳解,需要的朋友可以參考下2022-01-01Python基于百度AI實(shí)現(xiàn)OCR文字識(shí)別
這篇文章主要介紹了Python基于百度AI實(shí)現(xiàn)OCR文字識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04pytorch實(shí)現(xiàn)線(xiàn)性回歸
這篇文章主要為大家詳細(xì)介紹了pytorch實(shí)現(xiàn)線(xiàn)性回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04Python中使用插入排序算法的簡(jiǎn)單分析與代碼示例
這篇文章主要介紹了Python使用插入排序算法的簡(jiǎn)單分析與代碼示例,插入算法的平均時(shí)間復(fù)雜度為O(n^2),需要的朋友可以參考下2016-05-05python棧的基本定義與使用方法示例【初始化、賦值、入棧、出棧等】
這篇文章主要介紹了python棧的基本定義與使用方法,結(jié)合實(shí)例形式分析了Python棧的初始化、賦值、入棧、出棧等相關(guān)操作技巧,需要的朋友可以參考下2019-10-10Django集成搜索引擎Elasticserach的方法示例
這篇文章主要介紹了Django集成搜索引擎Elasticserach的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06