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

3、隨機生成length長的字符串

4、隨機生成顏色

5、隨機生成線

6、隨機生成點

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


四、效果展示

五、代碼
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 # 驗證碼字符串的長度
self.width = width # 圖片的寬
self.height = height # 圖片的高
self.size = size # 字體的大小
# 隨機生成字符串
def random_str(self):
# string.ascii_letters包含字母的大小寫,值為abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
# source = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
source = string.ascii_letters + '0123456789'
# 隨機從source中獲取length個不重復(fù)的元素,然后拼接
return ''.join(random.sample(source, self.length))
# 隨機生成顏色
def random_color(self, start=0, end=255):
# 元組推導(dǎo)式,(a, b, c), a, b, c默認范圍為0~255, 就是RGB
res = (random.randint(start, end) for i in range(3))
return tuple(res)
# 隨機生成線
def random_lines(self, draw):
# 在圖片上隨機位置上生成4條線
for i in range(self.length):
# 生成一個帶有兩個元組元素的列表,第一個元組表示線的開始坐標(biāo),第二個元組表示線的結(jié)束坐標(biāo)
lines = [(random.randint(0, self.width), random.randint(0, self.height)) for i in range(2)]
# line方法用來繪制線條,參數(shù)一:線的起始位置和結(jié)束位置,參數(shù)2:顏色,參數(shù)3:線的寬度
draw.line(lines, fill=self.random_color(64, 255), width=2)
# 隨機生成點
def random_points(self, draw, rate):
# 因為width為圖形驗證碼的寬,height為圖形驗證碼的高,整個圖都是由點組成的
# 點的x坐標(biāo)范圍:[0, 圖形的寬度], y的坐標(biāo)范圍:[0, 圖形的高度], 這樣就能遍歷圖像的每一個像素點
# rate 用來控制點生成的概率,大約100個點有rate個點被選中
# point方法用來畫點,參數(shù)1:點的坐標(biāo), 參數(shù)2:點的顏色
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))
# 生成驗證碼圖片
def image_code(self):
# 創(chuàng)建一個新圖像 參數(shù)1:這個圖像是RGB模式的,意味著它包含紅色、綠色和藍色三個顏色通道,
# 參數(shù)2:圖像的寬高
# 參數(shù)3:圖像的初始背景色
image = Image.new('RGB', (self.width, self.height), (255, 255, 255))
# ImageFont.truetype()加載字體函數(shù),參數(shù)1:字體,去網(wǎng)上找一個字體即可,參數(shù)2:字體大小
font = ImageFont.truetype(f'SourceHanSans-Bold.otf', self.size)
# 畫圖
draw = ImageDraw.Draw(image)
# 在圖上畫線和點
self.random_lines(draw)
self.random_points(draw, 15)
# 生成驗證碼
code = self.random_str()
# text函數(shù)用來繪制文本
# 參數(shù)1:繪制文本的坐標(biāo)
# 參數(shù)2:文本,這里將4位字符的驗證碼拆開繪制
# 參數(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')
# 返回圖像和驗證碼
return image, code
if __name__ == '__main__':
verify = ImageVerify()
image, text = verify.image_code()
print(image, text)
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)文字pdf轉(zhuǎn)換圖片pdf效果
當(dāng)我們把word轉(zhuǎn)化為pdf,wps默認轉(zhuǎn)化為文字pdf,而圖片pdf要會員。所以本文將通過Python語言實現(xiàn)文字pdf轉(zhuǎn)換圖片pdf,需要的可以參考一下2022-04-04
python利用pymysql和openpyxl實現(xiàn)操作MySQL數(shù)據(jù)庫并插入數(shù)據(jù)
這篇文章主要為大家詳細介紹了如何使用Python連接MySQL數(shù)據(jù)庫,并從Excel文件中讀取數(shù)據(jù),將其插入到MySQL數(shù)據(jù)庫中,有需要的小伙伴可以參考一下2023-10-10
使用Python實現(xiàn)文本情感分析預(yù)處理的詳細教程
在自然語言處理(NLP)領(lǐng)域,文本情感分析是一項重要任務(wù),它旨在通過計算機技術(shù)識別和提取文本中的情感傾向(如正面、負面或中性),為了實現(xiàn)準確的情感分析,預(yù)處理步驟至關(guān)重要,所以本文給大家介紹了使用Python實現(xiàn)文本情感分析預(yù)處理的詳細教程,需要的朋友可以參考下2025-04-04
使用Selenium控制當(dāng)前已經(jīng)打開的chrome瀏覽器窗口
有時通過selenium打開網(wǎng)站時,發(fā)現(xiàn)有些網(wǎng)站需要掃碼登錄,就很頭疼,導(dǎo)致爬蟲進展不下去,下面這篇文章主要給大家介紹了關(guān)于使用Selenium控制當(dāng)前已經(jīng)打開的chrome瀏覽器窗口的相關(guān)資料,需要的朋友可以參考下2022-07-07
python pandas輕松通過特定列的值多條件去篩選數(shù)據(jù)及contains方法的使用
這篇文章主要介紹了python pandas輕松通過特定列的值多條件去篩選數(shù)據(jù)及contains方法的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02

