標籤:

Python練習第六題,生成隨機字母

第六題:使用 Python 生成類似於下圖中的字母驗證碼圖片

1、思路:隨機生成一位字母

參考文檔string - 常用字元串操作string

string.ascii_letters

與此級聯(即包含)的 ascii_lowercase 和 ascii_uppercase 描述見下文。該值不依賴於本地設置。

string.ascii_lowercase

小寫字母 abcdefghijklmnopqrstuvwxyz.該值不依賴於本地設置以及不會被修改。

string.ascii_uppercase

大寫字母 ABCDEFGHIJKLMNOPQRSTUVWXYZ.該值不依賴於本地設置以及不會被修改。

2、具體操作(利用string和random)

>>> import stringn>>> string.ascii_lettersnabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZn>>> import randomn>>> random.choice(string.ascii_uppercase)nGn

參考Generate a random letter in Python

首先生成52位大寫及小寫字母,再利用random提取其中一位便成為隨即字母。

3、完整代碼

import stringnimport randomnfrom PIL import Image, ImageDraw, ImageFont, ImageFilternn#captcha sizensize = (240, 60)nn#random charsndef gen_random():n charlist = [random.choice(string.ascii_uppercase) for i in range(4)]n chars = .join(charlist)n return charsnndef random_color():n return (random.randint(0, 255), random.randint(0, 255), n random.randint(0, 255))nnndef gen_captcha():n im = Image.new(RGBA, size, color = 0)n draw = ImageDraw.Draw(im)nn #background n for w in range(size[0]):n for h in range(size[1]):n draw.point((w, h), random_color())nn #draw textn chars = gen_random()n #font and sizen fnt = ImageFont.truetype(arial.ttf, int(size[1] * 0.8))n x = 0n y = size[1] * 0.1nn for i in range(4):n x += size[0] * 0.2n draw.text((x, y), chars[i], font = fnt, fill = random_color())nn #blurn im = im.filter(ImageFilter.BLUR)n im.save(captchar.jpg)n im.show()n nif __name__ == __main__:n gen_captcha()n

看看運行結果

更多解法:

from PIL import Image, ImageDraw, ImageFont, ImageFilternimport randomnndef rndChar():n return chr(random.randint(65, 90))nndef rndColor(type):n if type == 1:n return (random.randint(0, 125), random.randint(0, 125), random.randint(0, 125))n elif type == 2:n return (random.randint(126, 255), random.randint(126, 255), random.randint(126, 255))nnfontSize = 25nwidth = int(fontSize * 1.2 * 4)nheight = int(fontSize * 1.2)nn# 創建圖像nimage = Image.new(RGB, (width, height), (255, 255, 255))n# 創建字體,本地字體存放位置nfont = ImageFont.truetype("C:WindowsFontsArial.ttf", 20)nndraw = ImageDraw.Draw(image)nn# 填滿整個畫面nfor x in range(width):n for y in range(height):n draw.point((x, y), fill = rndColor(1))nn# 輸出字母nfor t in range(4):n draw.text((t * height + fontSize * 0.2, fontSize * 0.2), rndChar(), font = font, fill = rndColor(2))nnif __name__ == __main__:n image.show()n

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------花了半天時間使用利用HEXO搭建了自己的博客崔斯特的博客

感興趣的可以點進去看看,這是博客最開始的樣子,還沒有往裡面寫什麼東西。不過頁面簡潔、看著很舒服~~

歡迎關注我的博客

推薦閱讀:6.1. string - Common string operations - Python 3.6.0 documentation,9.6. random - Generate pseudo-random numbers - Python 3.5.3 documentation,Pillow (PIL Fork) 4.0.0 documentation

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

推薦閱讀:

Python 里為什麼函數可以返回一個函數內部定義的函數?
Hello Word —— 使用Python讀寫Office文檔之一
借石攻玉——如何用 Python 調用其他程序和代碼
Pandas筆記|【機器學習集訓營學員】(下)
Python實現3D建模工具

TAG:Python |