切換語言為:簡體
使用 Python 生成圖片驗證碼

使用 Python 生成圖片驗證碼

  • 爱糖宝
  • 2024-07-02
  • 2086
  • 0
  • 0

驗證碼(Captcha)是一種用於識別使用者是否為真人的技術。在Web應用程式中,驗證碼通常用於防止自動化程式(如機器人)對網站進行惡意操作。

本文將介紹如何使用Python的PIL庫(Pillow)生成簡單的驗證碼圖片和相應的文字,以及程式碼實現中的關鍵步驟和技術細節。

1. 需求分析

我們需要生成一個包含隨機字元的驗證碼圖片,其中包括以下功能要求:

  • 圖片大小為250x60畫素。

  • 字型大小為48畫素。

  • 包含干擾線和干擾點以增加驗證碼的複雜性。

  • 隨機生成4個字元的驗證碼文字。

2. 技術選型

爲了實現以上需求,我們選擇使用Python的PIL庫(Pillow)。PIL是Python Imaging Library的延伸庫,提供了豐富的影象處理功能,包括建立影象、繪製文字和圖形、處理顏色等。

3. 準備工作

首先,我們需要安裝Python和Pillow庫。Pillow是Python Imaging Library(PIL)的一個分支,提供了豐富的影象處理功能。

pip install Pillow

4. 程式碼實現詳解

4.1 類設計

我們設計了一個名為CaptchaGenerator的類,用於生成驗證碼圖片和文字。以下是該類的主要設計和功能:

from PIL import Image, ImageDraw, ImageFont
import string
import random

class CaptchaGenerator:
    def __init__(self, width=250, height=60, font_size=48):
        """
        初始化驗證碼生成器。

        Args:
        - width (int): 圖片寬度,預設為250畫素。
        - height (int): 圖片高度,預設為60畫素。
        - font_size (int): 字型大小,預設為48畫素。
        """
        self.width = width
        self.height = height
        self.font_size = font_size
        self.chars = string.ascii_letters + string.digits  # 驗證碼字符集合
        self.bgcolor = (255, 255, 255)  # 圖片背景顏色
        self.linecolor = (random.randint(0, 128), random.randint(0, 128), random.randint(0, 128))  # 干擾線顏色
        self.dotcolor = (random.randint(0, 128), random.randint(0, 128), random.randint(0, 128))  # 干擾點顏色
        self.fontcolor = (random.randint(0, 128), random.randint(0, 128), random.randint(0, 128))  # 字型顏色

    def generate_captcha(self):
        """
        生成驗證碼圖片和文字。

        Returns:
        - image (PIL.Image.Image): 生成的驗證碼圖片物件。
        - captcha_text (str): 生成的驗證碼文字。
        """
        captcha_text = ''.join(random.choice(self.chars) for _ in range(4))  # 隨機生成驗證碼文字
        image = Image.new('RGB', (self.width, self.height), self.bgcolor)  # 建立RGB模式的空白圖片
        draw = ImageDraw.Draw(image)  # 建立可在影象上繪圖的物件

        font = ImageFont.load_default().font_variant(size=self.font_size)  # 載入預設字型並調整大小

        # 繪製干擾線
        for i in range(5):
            x1 = random.randint(0, self.width)
            y1 = random.randint(0, self.height)
            x2 = random.randint(0, self.width)
            y2 = random.randint(0, self.height)
            draw.line((x1, y1, x2, y2), fill=self.linecolor, width=3)

        # 繪製干擾點
        for i in range(200):
            x = random.randint(0, self.width)
            y = random.randint(0, self.height)
            draw.point((x, y), fill=self.dotcolor)

        # 繪製驗證碼文字,包括陰影效果
        for i, char in enumerate(captcha_text):
            shadow_offset = random.randint(0, 3)
            shadow_color = (0, 0, 0)
            draw.text((20 + i * 50 + shadow_offset, 5 + shadow_offset), char, font=font, fill=shadow_color)  # 繪製陰影效果的文字
            draw.text((20 + i * 50, 5), char, font=font, fill=self.fontcolor)  # 繪製文字

        return image, captcha_text

4.2 方法解析

  • __init__ 方法:初始化驗證碼生成器,設定預設引數如圖片尺寸、字型大小和顏色。

  • generate_captcha 方法:生成驗證碼圖片和文字,包括建立圖片、繪製干擾線和點、繪製驗證碼文字及其陰影效果。

5. 示例用法

# 示例用法
captcha_gen = CaptchaGenerator()  # 建立驗證碼生成器例項
captcha_image, captcha_text = captcha_gen.generate_captcha()  # 生成驗證碼圖片和文字
captcha_image.show()  # 顯示驗證碼圖片

6. 效果

使用 Python 生成圖片驗證碼

使用 Python 生成圖片驗證碼

使用 Python 生成圖片驗證碼

使用 Python 生成圖片驗證碼

7. 總結

本文介紹瞭如何使用Python的PIL庫生成簡單的驗證碼圖片和文字。透過實現CaptchaGenerator類,我們可以輕鬆生成包含隨機字元和干擾元素的驗證碼。這種技術可以應用於Web應用程式中,用於增強使用者驗證的安全性和可靠性。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.