Python簡單的制作圖片驗(yàn)證碼

--人人可以學(xué)Python--
這里示范的驗(yàn)證碼都是簡單的坛善,你也可以把字符扭曲

人人可以學(xué)Python.png

Python第三方庫無比強(qiáng)大,PIL 是python的一個d第三方圖片處理模塊,我們也可以使用它來生成圖片驗(yàn)證碼
PIL安裝
命令安裝:

pip install pillow

下載源碼安裝:
復(fù)制地址 :https://github.com/python-pillow/Pillow

PIL使用###

例子:生成圖片咬最,并填充文字

#!/usr/bin/python
#-*-coding:utf-8-*-
from PIL import Image, ImageDraw, ImageFont, ImageFilter
# 實(shí)例一個圖片對象240 x 60:
width = 60 * 4
height = 60
# 圖片顏色
clo = (43, 34, 88) # 我覺得是紫藍(lán)色
image = Image.new('RGB', (width, height), clo)

# 創(chuàng)建Font對象:
# 字體文件可以使用操作系統(tǒng)的,也可以網(wǎng)上下載
font = ImageFont.truetype('./font/Arial.ttf', 36)

# 創(chuàng)建Draw對象:
draw = ImageDraw.Draw(image)

# 輸出文字:
str1 = "ren ren Python"
w = 4  #距離圖片左邊距離
h = 10 #距離圖片上邊距離
draw.text((w, h), str1, font=font)
# 模糊:
image.filter(ImageFilter.BLUR)
code_name = 'test_code_img.jpg'
save_dir = './{}'.format(code_name)
image.save(save_dir, 'jpeg')
print("已保存圖片: {}".format(save_dir))
(venv) allenwoo@~/renren/code$ python test2.py 
已保存圖片: ./test_code_img.jpg

圖片如下:

Paste_Image.png

文字沒有什么色彩欠动,我們也可以加上顏色,只需要在 text 中傳人 fill 參數(shù)就好
draw.text((w, h), str1, font=font, fill = (78, 64, 65))
隨便加的顏色


Paste_Image.png

**我們還可以把背景弄成很多個小點(diǎn)永乌,每隔n隔像素填充個其他顏色比如: **

#!/usr/bin/python
#-*-coding:utf-8-*-
from PIL import Image, ImageDraw, ImageFont, ImageFilter
# 實(shí)例一個圖片對象240 x 60:
width = 60 * 4
height = 60
# 圖片顏色
clo = (43, 34, 88) # 我覺得是紫藍(lán)色
image = Image.new('RGB', (width, height), clo)

# 創(chuàng)建Font對象:
# 字體文件可以使用操作系統(tǒng)的,也可以網(wǎng)上下載
font = ImageFont.truetype('./font/Arial.ttf', 36)

# 創(chuàng)建Draw對象:
draw = ImageDraw.Draw(image)

# 填充像素:
# 寬每隔 20具伍, 高每隔5, 形成坐標(biāo)x,y
# 紅色:220,20,60
for x in range(0, width, 20):
    for y in range(0, height, 5):
        draw.point((x, y), fill=(220, 20, 60))

# 輸出文字:
str1 = "we are renren"
w = 4  #距離圖片左邊距離
h = 10 #距離圖片上邊距離
draw.text((w, h), str1, font=font, fill = (78, 64, 65))
# 模糊:
image.filter(ImageFilter.BLUR)
code_name = 'test_code_img.jpg'
save_dir = './{}'.format(code_name)
image.save(save_dir, 'jpeg')
print("已保存圖片: {}".format(save_dir))

結(jié)果圖片:

Paste_Image.png

PIL制作驗(yàn)證碼####

利用以上這些翅雏,還有我們之前學(xué)習(xí)的隨機(jī)生成器random就可以做個驗(yàn)證碼了,
生成驗(yàn)證碼代碼

#!/usr/bin/python
#-*-coding:utf-8-*-
from uuid import uuid1
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
def rnd_char():
    '''
    隨機(jī)一個字母或者數(shù)字
    :return: 
    '''
    # 隨機(jī)一個字母或者數(shù)字
    i = random.randint(1,3)
    if i == 1:
        # 隨機(jī)個數(shù)字的十進(jìn)制ASCII碼
        an = random.randint(97, 122)
    elif i == 2:
        # 隨機(jī)個小寫字母的十進(jìn)制ASCII碼
        an = random.randint(65, 90)
    else:
        # 隨機(jī)個大寫字母的十進(jìn)制ASCII碼
        an = random.randint(48, 57)
    # 根據(jù)Ascii碼轉(zhuǎn)成字符人芽,return回去
    return chr(an)

# 干擾
def rnd_dis():
    '''
    隨機(jī)一個干擾字
    :return: 
    '''
    d = ['^','-', '~', '_', '.']
    i = random.randint(0, len(d)-1)
    return d[i]

# 兩個隨機(jī)顏色都規(guī)定不同的區(qū)域望几,防止干擾字符和驗(yàn)證碼字符顏色一樣
# 隨機(jī)顏色1:
def rnd_color():
    '''
    隨機(jī)顏色,規(guī)定一定范圍
    :return: 
    '''
    return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))

# 隨機(jī)顏色2:
def rnd_color2():
    '''
      隨機(jī)顏色萤厅,規(guī)定一定范圍
      :return: 
      '''
    return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

def create_code():
    # 240 x 60:
    width = 60 * 4
    height = 60
    image = Image.new('RGB', (width, height), (192, 192, 192))
    # 創(chuàng)建Font對象:
    font = ImageFont.truetype('./font/Arial.ttf', 36)

    # 創(chuàng)建Draw對象:
    draw = ImageDraw.Draw(image)

    # 填充每個像素:
    for x in range(0, width, 20):
        for y in range(0, height, 10):
            draw.point((x, y), fill=rnd_color())

    # 填充字符
    _str = ""
    # 填入4個隨機(jī)的數(shù)字或字母作為驗(yàn)證碼
    for t in range(4):
        c = rnd_char()
        _str = "{}{}".format(_str, c)

        # 隨機(jī)距離圖片上邊高度橄抹,但至少距離30像素
        h = random.randint(1, height-30)
        # 寬度的化靴迫,每個字符占圖片寬度1/4,在加上10個像素空隙
        w = width/4 * t + 10
        draw.text((w, h), c, font=font, fill=rnd_color2())

    # 實(shí)際項(xiàng)目中,會將驗(yàn)證碼 保存在數(shù)據(jù)庫楼誓,并加上時(shí)間字段
    print("保存驗(yàn)證碼 {} 到數(shù)據(jù)庫".format(_str))

    # 給圖片加上字符干擾玉锌,密集度由 w, h控制
    for j in range(0, width, 30):
        dis = rnd_dis()
        w = t * 15 + j

        # 隨機(jī)距離圖片上邊高度,但至少距離30像素
        h = random.randint(1, height - 30)
        draw.text((w, h), dis, font=font, fill=rndColor())

    # 模糊:

    image.filter(ImageFilter.BLUR)

    # uuid1 生成唯一的字符串作為驗(yàn)證碼圖片名稱
    code_name = '{}.jpg'.format(uuid1())
    save_dir = './{}'.format(code_name)
    image.save(save_dir, 'jpeg')
    print("已保存圖片: {}".format(save_dir))

# 當(dāng)直接運(yùn)行文件的是和疟羹,運(yùn)行下面代碼
if __name__ == "__main__":
    create_code()
(venv) allenwoo@~/renren/code$ python test.py 
保存驗(yàn)證碼 ef3k 到數(shù)據(jù)庫
已保存圖片: ./c86e03c0-1c23-11e7-999d-f45c89c09e61.jpg
(venv) allenwoo@~/renren/code$ python test.py 
保存驗(yàn)證碼 I37X 到數(shù)據(jù)庫
已保存圖片: ./cb8aed02-1c23-11e7-9b18-f45c89c09e61.jpg
(venv) allenwoo@~/renren/code$ python test.py 
保存驗(yàn)證碼 vVL1 到數(shù)據(jù)庫
已保存圖片: ./cc120da8-1c23-11e7-b762-f45c89c09e61.jpg
(venv) allenwoo@~/renren/code$ python test.py 
保存驗(yàn)證碼 K6w3 到數(shù)據(jù)庫
已保存圖片: ./cc891e05-1c23-11e7-b7ec-f45c89c09e61.jpg
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png

你覺得難不難呢主守?最后這個生成驗(yàn)證碼代碼中有些邏輯問題要理解下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市榄融,隨后出現(xiàn)的幾起案子参淫,更是在濱河造成了極大的恐慌,老刑警劉巖愧杯,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涎才,死亡現(xiàn)場離奇詭異,居然都是意外死亡民效,警方通過查閱死者的電腦和手機(jī)憔维,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門涛救,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畏邢,“玉大人,你說我怎么就攤上這事检吆∈嫖” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵蜈缤,是天一觀的道長蹂安。 經(jīng)常有香客問我嫌蚤,道長,這世上最難降的妖魔是什么咆贬? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮帚呼,結(jié)果婚禮上掏缎,老公的妹妹穿的比我還像新娘。我一直安慰自己煤杀,他們只是感情好眷蜈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沈自,像睡著了一般酌儒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枯途,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天忌怎,我揣著相機(jī)與錄音籍滴,去河邊找鬼。 笑死呆躲,一個胖子當(dāng)著我的面吹牛异逐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播插掂,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼灰瞻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辅甥?” 一聲冷哼從身側(cè)響起酝润,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎璃弄,沒想到半個月后要销,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夏块,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年疏咐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脐供。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡浑塞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出政己,到底是詐尸還是另有隱情酌壕,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布歇由,位于F島的核電站卵牍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沦泌。R本人自食惡果不足惜糊昙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谢谦。 院中可真熱鬧释牺,春花似錦、人聲如沸他宛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厅各。三九已至镜撩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袁梗。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工宜鸯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遮怜。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓淋袖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锯梁。 傳聞我的和親對象是個殘疾皇子即碗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 經(jīng)過對django的初步學(xué)習(xí),我們已經(jīng)對后臺的基本流程以及django的運(yùn)作有了一定的了解陌凳,但是這還不足夠剥懒,dja...
    coder_ben閱讀 3,827評論 8 34
  • GitHub 上有一個 Awesome - XXX 系列的資源整理,資源非常豐富,涉及面非常廣合敦。awesome-p...
    若與閱讀 18,630評論 4 418
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,454評論 6 428
  • 環(huán)境管理管理Python版本和環(huán)境的工具初橘。p–非常簡單的交互式python版本管理工具。pyenv–簡單的Pyth...
    MrHamster閱讀 3,791評論 1 61
  • 讀這本書的原由: 國慶假期充岛,要去上海參加由本書的作者李明老師親自教的敘事心理治療課程保檐。心里想著,怎么也要把這本書看...
    楊金平閱讀 2,365評論 0 1