国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用python,生成數(shù)字在圖片上的驗(yàn)證碼

這篇具有很好參考價(jià)值的文章主要介紹了使用python,生成數(shù)字在圖片上的驗(yàn)證碼。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

使用python,生成數(shù)字在圖片上的驗(yàn)證碼,python,python,開(kāi)發(fā)語(yǔ)言
許多網(wǎng)站在注冊(cè)時(shí)都要求輸入驗(yàn)證碼,這樣做為了防止被程序惡意注冊(cè)和保證網(wǎng)站安全

1. Pillow

PIL(Python Imaging Library)是一個(gè)強(qiáng)大的python圖像處理庫(kù),只是支持到python2.7, Pillow雖說(shuō)是PIL的一個(gè)分支,但是pillow支持python3.x,已經(jīng)發(fā)展成比PIL本身更具活力的圖像處理庫(kù),我們使用Pillow來(lái)生成驗(yàn)證碼,安裝方式為

pip install Pillow

2. 生成一張指定大小隨機(jī)顏色的圖片

2.1 隨機(jī)顏色

顏色的處理使用(r,g,b)格式,r, g, b 的范圍是[0, 255], 使用random模塊的randint方法生成3個(gè)隨機(jī)數(shù)

def random_color():
    c1 = random.randint(0, 255)
    c2 = random.randint(0, 255)
    c3 = random.randint(0, 255)
    return c1, c2, c3

2.2 生成一張指定大小的圖片

def random_color():
    c1 = random.randint(0, 255)
    c2 = random.randint(0, 255)
    c3 = random.randint(0, 255)
    return c1, c2, c3

def generate_picture(width=120, height=35):
    image = Image.new('RGB', (width, height), random_color())
    return image

if __name__ == '__main__':
    image = generate_picture()
    image.save('test.png')

使用python,生成數(shù)字在圖片上的驗(yàn)證碼,python,python,開(kāi)發(fā)語(yǔ)言

現(xiàn)在還只是生成了一張顏色隨機(jī)的圖片,接下來(lái)要在圖片上面寫(xiě)上隨機(jī)數(shù)字和字母

3. 在圖片上寫(xiě)上隨機(jī)數(shù)字和字母

3.1 生成隨機(jī)數(shù)字和字母

def get_random_str():
    '''
    獲取一個(gè)隨機(jī)字符, 數(shù)字或小寫(xiě)字母
    :return:
    '''
    random_num = str(random.randint(0, 9))
    random_low_alpha = chr(random.randint(97, 122))
    random_char = random.choice([random_num, random_low_alpha])
    return random_char

使用random模塊提供的隨機(jī)函數(shù)生成指定長(zhǎng)度的字符串

3.2 在image對(duì)象上畫(huà)數(shù)字和字母

def draw_str(count, image, font_size):
    """
    在圖片上寫(xiě)隨機(jī)字符
    :param count: 字符數(shù)量
    :param image: 圖片對(duì)象
    :param font_size: 字體大小
    :return:
    """
    draw = ImageDraw.Draw(image)
    # 獲取一個(gè)font字體對(duì)象參數(shù)是ttf的字體文件的目錄,以及字體的大小
    font_file = os.path.join('Andale Mono.ttf')
    font = ImageFont.truetype(font_file, size=font_size)
    temp = []
    for i in range(count):
        random_char = random_str()
        draw.text((10+i*30, -2), random_char, random_color(), font=font)
        temp.append(random_char)

    valid_str = "".join(temp)    # 驗(yàn)證碼
    return valid_str, image

if __name__ == '__main__':
    image = generate_picture()
    valid_str, image = draw_str(4, image, 35)
    image.save('test.png')

使用python,生成數(shù)字在圖片上的驗(yàn)證碼,python,python,開(kāi)發(fā)語(yǔ)言

創(chuàng)建一個(gè)ImageDraw.Draw對(duì)象,在image上畫(huà)隨機(jī)字符,你可以設(shè)置字體, 我使用了Andale Mono.ttf, mac電腦上在/System/Library/Fonts 目錄下找到字體,其他系統(tǒng)也有各自的字體文件,將字體文件復(fù)制到與腳本相同的目錄下。

4. 制造噪點(diǎn)

為了防止驗(yàn)證碼被輕易的破解,還應(yīng)該在圖片上制造一些噪點(diǎn),隨機(jī)畫(huà)幾條線,隨機(jī)畫(huà)幾個(gè)點(diǎn)

def noise(image, width=120, height=35, line_count=3, point_count=20):
    '''

    :param image: 圖片對(duì)象
    :param width: 圖片寬度
    :param height: 圖片高度
    :param line_count: 線條數(shù)量
    :param point_count: 點(diǎn)的數(shù)量
    :return:
    '''
    draw = ImageDraw.Draw(image)
    for i in range(line_count):
        x1 = random.randint(0, width)
        x2 = random.randint(0, width)
        y1 = random.randint(0, height)
        y2 = random.randint(0, height)
        draw.line((x1, y1, x2, y2), fill=random_color())

        # 畫(huà)點(diǎn)
        for i in range(point_count):
            draw.point([random.randint(0, width), random.randint(0, height)], fill=random_color())
            x = random.randint(0, width)
            y = random.randint(0, height)
            draw.arc((x, y, x + 4, y + 4), 0, 90, fill=random_color())

    return image


if __name__ == '__main__':
    image = generate_picture()
    valid_str, image = draw_str(4, image, 35)
    image = noise(image)
    image.save('test.png')

使用python,生成數(shù)字在圖片上的驗(yàn)證碼,python,python,開(kāi)發(fā)語(yǔ)言

5. 生成base64編碼的圖片

實(shí)踐中,如果是生成網(wǎng)站注冊(cè)使用的驗(yàn)證碼圖片,一般來(lái)說(shuō)不會(huì)將其保存到圖片文件中,因?yàn)檫@會(huì)生成大量的小圖片,完全沒(méi)必要。我們可以將圖片的內(nèi)容保存到BytesIO對(duì)象中,最終生成base64編碼的圖片,這樣,向前端傳回去的就是字符串,格式為

data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAH...

data:image/jpeg;base64 這一段是固定寫(xiě)法,逗號(hào)剩余的部分是圖片經(jīng)過(guò)base64編碼后的字符串

def valid_code():
    """
    生成圖片驗(yàn)證碼,并對(duì)圖片進(jìn)行base64編碼
    :return:
    """
    image = generate_picture()
    valid_str, image = draw_str(4, image, 35)
    image = noise(image)

    f = BytesIO()
    image.save(f, 'png')        # 保存到BytesIO對(duì)象中, 格式為png
    data = f.getvalue()
    f.close()

    encode_data = base64.b64encode(data)
    data = str(encode_data, encoding='utf-8')
    img_data = "data:image/jpeg;base64,{data}".format(data=data)
    return valid_str, img_data

if __name__ == '__main__':
    print(valid_code())

6. 全部代碼

為了向你闡述生成驗(yàn)證碼圖片的過(guò)程,我將整個(gè)過(guò)程進(jìn)行拆解,因此代碼也被拆解的凌亂,你可以將這些代碼整合,以便在實(shí)際應(yīng)用中使用文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-690593.html

import os
import random
import base64
from io import BytesIO
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont


def random_color():
    c1 = random.randint(0, 255)
    c2 = random.randint(0, 255)
    c3 = random.randint(0, 255)
    return c1, c2, c3


def generate_picture(width=120, height=35):
    image = Image.new('RGB', (width, height), random_color())
    return image


def random_str():
    '''
    獲取一個(gè)隨機(jī)字符, 數(shù)字或小寫(xiě)字母
    :return:
    '''
    random_num = str(random.randint(0, 9))
    random_low_alpha = chr(random.randint(97, 122))
    random_char = random.choice([random_num, random_low_alpha])
    return random_char

def draw_str(count, image, font_size):
    """
    在圖片上寫(xiě)隨機(jī)字符
    :param count: 字符數(shù)量
    :param image: 圖片對(duì)象
    :param font_size: 字體大小
    :return:
    """
    draw = ImageDraw.Draw(image)
    # 獲取一個(gè)font字體對(duì)象參數(shù)是ttf的字體文件的目錄,以及字體的大小
    font_file = os.path.join('Andale Mono.ttf')
    font = ImageFont.truetype(font_file, size=font_size)
    temp = []
    for i in range(count):
        random_char = random_str()
        draw.text((10+i*30, -2), random_char, random_color(), font=font)
        temp.append(random_char)

    valid_str = "".join(temp)    # 驗(yàn)證碼
    return valid_str, image


def noise(image, width=120, height=35, line_count=3, point_count=20):
    '''

    :param image: 圖片對(duì)象
    :param width: 圖片寬度
    :param height: 圖片高度
    :param line_count: 線條數(shù)量
    :param point_count: 點(diǎn)的數(shù)量
    :return:
    '''
    draw = ImageDraw.Draw(image)
    for i in range(line_count):
        x1 = random.randint(0, width)
        x2 = random.randint(0, width)
        y1 = random.randint(0, height)
        y2 = random.randint(0, height)
        draw.line((x1, y1, x2, y2), fill=random_color())

        # 畫(huà)點(diǎn)
        for i in range(point_count):
            draw.point([random.randint(0, width), random.randint(0, height)], fill=random_color())
            x = random.randint(0, width)
            y = random.randint(0, height)
            draw.arc((x, y, x + 4, y + 4), 0, 90, fill=random_color())

    return image


def valid_code():
    """
    生成圖片驗(yàn)證碼,并對(duì)圖片進(jìn)行base64編碼
    :return:
    """
    image = generate_picture()
    valid_str, image = draw_str(4, image, 35)
    image = noise(image)

    f = BytesIO()
    image.save(f, 'png')        # 保存到BytesIO對(duì)象中, 格式為png
    data = f.getvalue()
    f.close()

    encode_data = base64.b64encode(data)
    data = str(encode_data, encoding='utf-8')
    img_data = "data:image/jpeg;base64,{data}".format(data=data)
    return valid_str, img_data

if __name__ == '__main__':
    print(valid_code())

到了這里,關(guān)于使用python,生成數(shù)字在圖片上的驗(yàn)證碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • python- 用GAN(Generative Adversarial Networks)實(shí)現(xiàn),用于生成手寫(xiě)數(shù)字圖片。

    用GAN(Generative Adversarial Networks)實(shí)現(xiàn),用于生成手寫(xiě)數(shù)字圖片。 導(dǎo)入 PyTorch 和相關(guān)的庫(kù),包括: torch : PyTorch 庫(kù)。 torch.nn : PyTorch 中的神經(jīng)網(wǎng)絡(luò)模塊。 torch.optim : PyTorch 中的優(yōu)化器。 torch.nn.functional : PyTorch 中的函數(shù)式接口。 torch.utils.data : PyTorch 中的數(shù)據(jù)加載器。 torchvision :

    2024年02月03日
    瀏覽(21)
  • 使用python庫(kù)解決登錄的驗(yàn)證碼識(shí)別-圖片驗(yàn)證碼

    使用python庫(kù)解決登錄的驗(yàn)證碼識(shí)別-圖片驗(yàn)證碼

    前言: 在UI自動(dòng)化測(cè)試和爬蟲(chóng)測(cè)試中,驗(yàn)證碼是個(gè)比較頭疼的問(wèn)題,包括:圖片驗(yàn)證碼,滑塊驗(yàn)證碼,等一些常見(jiàn)的驗(yàn)證碼場(chǎng)景。 識(shí)別驗(yàn)證碼的python 庫(kù)有很多,用起來(lái)也并不簡(jiǎn)單,這里推薦一個(gè)簡(jiǎn)單實(shí)用的識(shí)別驗(yàn)證碼的庫(kù) ddddocr (帶帶弟弟ocr)庫(kù)。 今天先用一個(gè)圖片驗(yàn)證碼示

    2023年04月11日
    瀏覽(15)
  • 利用PyTorch訓(xùn)練模型識(shí)別數(shù)字+英文圖片驗(yàn)證碼

    摘要:使用深度學(xué)習(xí)框架PyTorch來(lái)訓(xùn)練模型去識(shí)別4-6位數(shù)字+字母混合圖片驗(yàn)證碼(我們可以使用第三方庫(kù)captcha生成這種圖片驗(yàn)證碼或者自己收集目標(biāo)網(wǎng)站的圖片驗(yàn)證碼進(jìn)行針對(duì)訓(xùn)練)。 一、制作訓(xùn)練數(shù)據(jù)集 我們可以把需要生成圖片的一些參數(shù)放在setting.py文件中,方便以后更

    2024年04月15日
    瀏覽(16)
  • 前端生成圖片驗(yàn)證碼怎么做?

    前端生成圖片驗(yàn)證碼怎么做?

    ##題記:我們實(shí)現(xiàn)一個(gè)功能首先想一下我們需要做哪些工作,比如我們需要生成一個(gè)隨機(jī)的圖片驗(yàn)證碼,我們需要一個(gè)就是點(diǎn)擊事件獲取驗(yàn)證碼,通過(guò)接口我們?nèi)カ@取圖片路徑進(jìn)行渲染就行,這里邊還要牽扯一件事情就是獲取一個(gè)隨機(jī)數(shù)字,通過(guò)隨機(jī)數(shù)字我們傳給后端索取一

    2024年02月14日
    瀏覽(15)
  • java爬蟲(chóng)遇到網(wǎng)頁(yè)驗(yàn)證碼怎么辦?(使用selenium模擬瀏覽器并用python腳本解析驗(yàn)證碼圖片)

    ????????筆者這幾天在爬取數(shù)據(jù)的時(shí)候遇到了一個(gè)很鬧心的問(wèn)題,就是在我爬取數(shù)據(jù)的時(shí)候遇到了驗(yàn)證碼,而這個(gè)驗(yàn)證碼又是動(dòng)態(tài)生成的,嘗試了很多方法都沒(méi)能繞開(kāi)這個(gè)驗(yàn)證碼問(wèn)題。 ? ? ? ? 我的解決方案是:使用selenium模擬瀏覽器行為,獲取到動(dòng)態(tài)生成的驗(yàn)證碼后用

    2024年02月09日
    瀏覽(175)
  • vue3+elementplus前端生成圖片驗(yàn)證碼

    vue3+elementplus前端生成圖片驗(yàn)證碼

    1、安裝 使用npm i identify --save 或者 yarn add identify --save 2、新建vue組件components/identify/identify.vue 3、一般是登錄頁(yè)面用到這個(gè),在你的登錄頁(yè)面的from表單的相應(yīng)位置加上填寫(xiě)驗(yàn)證碼的html 4、在script下引入組件,并編寫(xiě)方法 5、效果 ?

    2024年01月20日
    瀏覽(27)
  • Python 使用 Stable Diffusion API 生成圖片示例

    Python 使用 Stable Diffusion API 生成圖片示例

    代碼: 輸出: 說(shuō)明: 運(yùn)行后,圖片以及 JSON 將會(huì)輸出到當(dāng)前目錄下 output 中; TIP: 當(dāng)然前提是你已經(jīng)部署好 Stable Diffusion API 服務(wù); 并且安裝好跟我一樣的模型以及一些相關(guān)的 LoRA ;

    2024年02月16日
    瀏覽(94)
  • C語(yǔ)言求矩陣主副對(duì)角線上的數(shù)字和案例講解

    C語(yǔ)言求矩陣主副對(duì)角線上的數(shù)字和案例講解

    思路分析 以四行四列的矩陣為例。 ?案例代碼如下 代碼運(yùn)行結(jié)果如下 ?如果題意要求的是矩陣主副對(duì)角線上的數(shù)字之和,我們只需對(duì)上面的代碼稍微修改即可。 代碼如下 代碼運(yùn)行結(jié)果如下 ?

    2024年02月03日
    瀏覽(18)
  • 樹(shù)莓派系統(tǒng)入門(mén)教程(三)—— 使用Windows上的VSCode遠(yuǎn)程連接樹(shù)莓派進(jìn)行Python開(kāi)發(fā)

    很多開(kāi)發(fā)者更喜歡在大屏幕和強(qiáng)大的開(kāi)發(fā)環(huán)境中編寫(xiě)代碼,但同時(shí)他們希望能在樹(shù)莓派這樣的微型計(jì)算機(jī)上執(zhí)行和測(cè)試代碼。VSCode提供了一個(gè)強(qiáng)大的遠(yuǎn)程開(kāi)發(fā)工具,可以讓你在Windows主機(jī)上編寫(xiě)代碼,同時(shí)在樹(shù)莓派上執(zhí)行。下面將為你詳細(xì)介紹如何實(shí)現(xiàn): 1. 安裝VSCode和SSH擴(kuò)展

    2024年02月12日
    瀏覽(21)
  • FPGA上的時(shí)間數(shù)字轉(zhuǎn)換器(TDC):詳細(xì)概述及FPGA開(kāi)發(fā)

    時(shí)間數(shù)字轉(zhuǎn)換器(Time-to-Digital Converter,簡(jiǎn)稱(chēng)TDC)是一種用于測(cè)量或記錄信號(hào)時(shí)間間隔的電子設(shè)備。在本文中,我們將詳細(xì)概述基于FPGA的TDC,并提供相應(yīng)的源代碼示例,以幫助讀者理解和實(shí)現(xiàn)這一功能。 一、TDC的工作原理 TDC的基本原理是測(cè)量信號(hào)的到達(dá)時(shí)間與參考時(shí)鐘之間的

    2024年02月05日
    瀏覽(529)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包