時間:2020-10-06來源:www.outletmksalestore.com作者:電腦系統城
一、驗證碼圖片的效果
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 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() |
運行結果:
KG7CQ
二、使用的方法介紹
上面的代碼已經實現了生成隨機驗證碼的功能,現在介紹代碼中用到的函數和方法。
Image.new(): Image模塊中的new()函數,創建一張圖片(畫布),用于繪圖。傳入3個參數,畫布的模式('RGB'表示真彩圖片)、尺寸和顏色,畫布的顏色就是驗證碼中的背景顏色。
ImageDraw.Draw(): ImageDraw模塊中的Draw()函數,實例化一個ImageDraw類的對象draw,執行繪圖。傳入兩個參數,畫布和繪圖的模式,畫布使用前面Image.new()創建的畫布,模式繼續使用'RGB'真彩模式。Draw()函數會將傳入的兩個參數傳給ImageDraw類,實例化一個類對象并返回,以便后面使用類對象draw調用對應的方法執行繪圖,使用draw對象將驗證碼中的字符畫在畫布上。
ImageFont.truetype(): ImageFont模塊中的truetype()函數,從字體文件或字體對象中讀取字體并返回一個字體對象。傳入兩個參數,字體文件(或字體對象)和字體大小。字體只能使用當前電腦支持的字體,在Windows系統中,已安裝的字體一般都保存在C:\Windows\Fonts文件夾中,如上面代碼中的C:\Windows\Fonts\Arial.ttf,應該每個人都默認安裝了,在代碼中一定要帶上擴展名'.ttf',否則讀取不到字體文件。如果字體不在Windows\Fonts這個目錄下,可以在控制面板找或直接在所有文件中搜索Fonts。字體大小傳入一個數字即可。
random模塊中的randint()和choice()。在上面的代碼中,randint()用于隨機生成顏色值,隨機生成字符在畫布上的x和y坐標。choice()用于從26個大寫字母(chr字符集中65~90為26個大寫字母)和數字中隨機選擇一個字符。
text(): ImageDraw模塊的ImageDraw類的方法,使用ImageDraw.Draw()返回的類對象draw來調用,將字符畫到畫布上。text()方法有12個參數,并且還可以接收其他的可變參數和關鍵字參數,不過只有兩個必傳參數,上面的代碼中也只傳了4個參數,所以其他的參數就不做介紹了。第一個必傳參數是xy,傳入一個元組或列表,表示字符畫到畫布上的位置坐標(字符左上角),第二個必傳參數是text,傳入一個字符串,表示需要畫的字符。上面還傳了兩個參數fill和font,fill表示字符的顏色,傳入一個隨機的顏色,font表示字符的字體,傳入用ImageFont.truetype()函數返回的字體對象。
循環將每次隨機生成的字符繪畫到畫布上,再使用image對象的show()方法將圖片顯示出來,隨機的驗證碼圖片就生成成功了。
三、優化封裝
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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() |
運行結果:
qtC7
驗證碼的字體一般不會使用很容易辨認的字體,可以換一個復雜一點的。除了大寫字母之外,也可以把小寫字母加進來。調整字符的位置避免畫到畫布的邊緣。將代碼封裝到一個函數中,并將image對象和驗證碼字符verify作為返回值,方便調用時展示圖片和進行驗證。
總結
到此這篇關于Python利用Pillow(PIL)庫實現驗證碼圖片的文章就介紹到這了,更多相關Python用Pillow(PIL)庫驗證碼圖片內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
2022-03-01
PHP如何從txt文件中讀取數據詳解2022-03-01
分享5個方便好用的Python自動化腳本2021-03-29
Python中pycharm編輯器界面風格修改方法