如何使用python的pillow庫(kù)生成圖像驗(yàn)證碼
一、pillow庫(kù)
Pillow庫(kù):是一個(gè)功能強(qiáng)大的Python圖像處理庫(kù),它提供了豐富的圖像處理功能,使得用戶(hù)能夠方便地使用Python對(duì)圖像進(jìn)行各種操作。
二、圖像驗(yàn)證碼的分析
首先需要一個(gè)圖像,圖像上需要繪制驗(yàn)證碼,還需要任意多的點(diǎn)和幾條線(xiàn)來(lái)造成干擾即可。
三、實(shí)現(xiàn)
1、安裝pillow庫(kù):pip install pillow
使用一個(gè)類(lèi)來(lái)實(shí)現(xiàn)圖像驗(yàn)證碼的生成
2、構(gòu)造方法__init__, 初始化圖像的寬、高,驗(yàn)證碼字符長(zhǎng)度、以及字體的大小。

3、隨機(jī)生成length長(zhǎng)的字符串

4、隨機(jī)生成顏色

5、隨機(jī)生成線(xiàn)

6、隨機(jī)生成點(diǎn)

7、生成驗(yàn)證碼圖像,調(diào)用上面編寫(xiě)好的方法


四、效果展示

五、代碼
import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import string
class ImageVerify:
def __init__(self, length=4, width=100, height=50, size=18):
self.length = length # 驗(yàn)證碼字符串的長(zhǎng)度
self.width = width # 圖片的寬
self.height = height # 圖片的高
self.size = size # 字體的大小
# 隨機(jī)生成字符串
def random_str(self):
# string.ascii_letters包含字母的大小寫(xiě),值為abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
# source = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
source = string.ascii_letters + '0123456789'
# 隨機(jī)從source中獲取length個(gè)不重復(fù)的元素,然后拼接
return ''.join(random.sample(source, self.length))
# 隨機(jī)生成顏色
def random_color(self, start=0, end=255):
# 元組推導(dǎo)式,(a, b, c), a, b, c默認(rèn)范圍為0~255, 就是RGB
res = (random.randint(start, end) for i in range(3))
return tuple(res)
# 隨機(jī)生成線(xiàn)
def random_lines(self, draw):
# 在圖片上隨機(jī)位置上生成4條線(xiàn)
for i in range(self.length):
# 生成一個(gè)帶有兩個(gè)元組元素的列表,第一個(gè)元組表示線(xiàn)的開(kāi)始坐標(biāo),第二個(gè)元組表示線(xiàn)的結(jié)束坐標(biāo)
lines = [(random.randint(0, self.width), random.randint(0, self.height)) for i in range(2)]
# line方法用來(lái)繪制線(xiàn)條,參數(shù)一:線(xiàn)的起始位置和結(jié)束位置,參數(shù)2:顏色,參數(shù)3:線(xiàn)的寬度
draw.line(lines, fill=self.random_color(64, 255), width=2)
# 隨機(jī)生成點(diǎn)
def random_points(self, draw, rate):
# 因?yàn)閣idth為圖形驗(yàn)證碼的寬,height為圖形驗(yàn)證碼的高,整個(gè)圖都是由點(diǎn)組成的
# 點(diǎn)的x坐標(biāo)范圍:[0, 圖形的寬度], y的坐標(biāo)范圍:[0, 圖形的高度], 這樣就能遍歷圖像的每一個(gè)像素點(diǎn)
# rate 用來(lái)控制點(diǎn)生成的概率,大約100個(gè)點(diǎn)有rate個(gè)點(diǎn)被選中
# point方法用來(lái)畫(huà)點(diǎn),參數(shù)1:點(diǎn)的坐標(biāo), 參數(shù)2:點(diǎn)的顏色
for x in range(self.width):
for y in range(self.height):
if random.randint(1, 100) <= rate:
draw.point((x, y), fill=self.random_color(64, 255))
# 生成驗(yàn)證碼圖片
def image_code(self):
# 創(chuàng)建一個(gè)新圖像 參數(shù)1:這個(gè)圖像是RGB模式的,意味著它包含紅色、綠色和藍(lán)色三個(gè)顏色通道,
# 參數(shù)2:圖像的寬高
# 參數(shù)3:圖像的初始背景色
image = Image.new('RGB', (self.width, self.height), (255, 255, 255))
# ImageFont.truetype()加載字體函數(shù),參數(shù)1:字體,去網(wǎng)上找一個(gè)字體即可,參數(shù)2:字體大小
font = ImageFont.truetype(f'SourceHanSans-Bold.otf', self.size)
# 畫(huà)圖
draw = ImageDraw.Draw(image)
# 在圖上畫(huà)線(xiàn)和點(diǎn)
self.random_lines(draw)
self.random_points(draw, 15)
# 生成驗(yàn)證碼
code = self.random_str()
# text函數(shù)用來(lái)繪制文本
# 參數(shù)1:繪制文本的坐標(biāo)
# 參數(shù)2:文本,這里將4位字符的驗(yàn)證碼拆開(kāi)繪制
# 參數(shù)3:字體
# 參數(shù)4:顏色
for i in range(self.length):
draw.text((29 * i, 14), code[i], font=font, fill=self.random_color(32, 127))
# 給圖像濾鏡
image = image.filter(ImageFilter.DETAIL)
# 保存圖像到當(dāng)前路徑
image.save(f'[code].jpg')
# 返回圖像和驗(yàn)證碼
return image, code
if __name__ == '__main__':
verify = ImageVerify()
image, text = verify.image_code()
print(image, text)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)坦克大戰(zhàn)游戲 附詳細(xì)注釋
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)坦克大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
Python subprocess模塊功能與常見(jiàn)用法實(shí)例詳解
這篇文章主要介紹了Python subprocess模塊功能與常見(jiàn)用法,結(jié)合實(shí)例形式詳細(xì)分析了subprocess模塊功能、常用函數(shù)相關(guān)使用技巧,需要的朋友可以參考下2018-06-06
python polars數(shù)據(jù)科學(xué)庫(kù)對(duì)比Pandas優(yōu)勢(shì)分析
這篇文章主要為大家介紹了python polars數(shù)據(jù)科學(xué)庫(kù)對(duì)比Pandas優(yōu)勢(shì)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Python使用SciencePlots庫(kù)繪制學(xué)術(shù)圖表詳解
這篇文章主要介紹了Python使用SciencePlots庫(kù)繪制學(xué)術(shù)圖表,SciencePlots提供了一系列預(yù)設(shè)的科學(xué)繪圖樣式,能夠幫助研究人員輕松創(chuàng)建專(zhuān)業(yè)的學(xué)術(shù)圖表,需要的朋友可以參考下2025-04-04
Tensorflow?2.1完成對(duì)MPG回歸預(yù)測(cè)詳解
這篇文章主要為大家介紹了Tensorflow?2.1完成對(duì)MPG回歸預(yù)測(cè)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Python 數(shù)據(jù)分析之Beautiful Soup 提取頁(yè)面信息
Beautiful Soup 提供一些簡(jiǎn)單的、python 式的函數(shù)用來(lái)處理導(dǎo)航、搜索、修改分析樹(shù)等功能。它是一個(gè)工具箱,通過(guò)解析文檔為用戶(hù)提供需要抓取的數(shù)據(jù),因?yàn)楹?jiǎn)單,所以不需要多少代碼就可以寫(xiě)出一個(gè)完整的應(yīng)用程序2021-10-10
python3 traceback模塊來(lái)追蹤和打印異常信息
本文主要介紹了python3 traceback模塊來(lái)追蹤和打印異常信息,這個(gè)模塊提供了許多函數(shù)來(lái)處理異常,并且能夠輸出異常的堆棧信息,感興趣的可以了解一下2024-02-02
Python 實(shí)現(xiàn)圖像逐像素點(diǎn)取鄰域數(shù)據(jù)
這篇文章主要介紹了Python 實(shí)現(xiàn)圖像逐像素點(diǎn)取鄰域數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03

