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 |