Python使用Pillow(PIL)库实现验证码图片

Python使用Pillow(PIL)库实现验证码图片

Pillow库有很多用途,本文使用Pillow来生成随机的验证码图片。

Pillow的用法参考:https://blog.csdn.net/weixin_43790276/article/details/108478270

验证码是随机的,使用Python内置的random库来生成随机的颜色和随机的字符。

random的用法参考:https://blog.csdn.net/weixin_43790276/article/details/96768637

一、验证码图片的效果

# coding=utf-8
import random
from PIL import Image, ImageDraw, ImageFont


width, height, font_size, font_num = 300, 100, 48, 5
bg_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
image = Image.new(mode='RGB', size=(width, height), color=bg_color)
draw = ImageDraw.Draw(image, mode='RGB')
font = ImageFont.truetype("C:\Windows\Fonts\Arial.ttf", font_size)
verify = str()
for i in range(font_num):
    x = random.randint(i*(width/font_num), (i+1)*(width/font_num)-font_size)
    y = random.randint(0, height-font_size)
    char = random.choice([chr(alpha) for alpha in range(65, 91)] + [str(num) for num in range(10)])
    verify += char
    color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    draw.text((x, y), char, fill=color, font=font)
print(verify)
image.show()

运行结果:

KG7CQ

二、使用的方法介绍

上面的代码已经实现了生成随机验证码的功能,现在介绍代码中用到的函数和方法。

Image.new(): Image模块中的new()函数,创建一张图片(画布),用于绘图。传入3个参数,画布的模式('RGB'表示真彩图片)、尺寸和颜色,画布的颜色就是验证码图片中的背景颜色。

ImageDraw.Draw(): ImageDraw模块中的Draw()函数,实例化一个ImageDraw类的对象draw,执行绘图。传入两个参数,画布和绘图的模式,画布使用前面Image.new()创建的画布,模式继续使用'RGB'真彩模式。Draw()函数会将传入的两个参数传给ImageDraw类,实例化一个类对象并返回,以便后面使用类对象draw调用对应的方法执行绘图,使用draw对象将验证码中的字符画在画布上。

ImageFont.truetype(): ImageFont模块中的truetype()函数,从字体文件或字体对象中读取字体并返回一个字体对象。传入两个参数,字体文件(或字体对象)和字体大小。字体只能使用当前电脑支持的字体,在Windows系统中,已安装的字体一般都保存在C:\Windows\Fonts文件夹中,如上面代码中的C:\Windows\Fonts\Arial.ttf,应该每个人都默认安装了,在代码中一定要带上扩展名'.ttf',否则读取不到字体文件。如果字体不在Windows\Fonts这个目录下,可以在控制面板找或直接在所有文件中搜索Fonts。字体大小传入一个数字即可。

random模块中的randint()和choice()。在上面的代码中,randint()用于随机生成颜色值,随机生成字符在画布上的x和y坐标。choice()用于从26个大写字母(chr字符集中的65~90)和数字中随机选择一个字符。

text(): ImageDraw模块中ImageDraw类的方法,使用ImageDraw.Draw()返回的类对象draw来调用,将字符画到画布上。text()方法有12个参数,并且还可以接收其他的可变参数和关键字参数,不过只有两个必传参数,上面的代码中也只传了4个参数,所以其他的参数就不做介绍了。第一个必传参数是xy,传入一个元组或列表,表示字符画到画布上的位置坐标(字符左上角),第二个必传参数是text,传入一个字符串,表示需要画的字符。上面还传了两个参数fill和font,fill表示字符的颜色,传入一个随机的颜色,font表示字符的字体,传入用ImageFont.truetype()函数返回的字体对象。

循环将每次随机生成的字符绘画到画布上,再使用image对象的show()方法将图片显示出来,随机的验证码图片就生成成功了。

三、优化封装

import random
from PIL import Image, ImageDraw, ImageFont


def gen_verified_image():
    width, height, font_size, font_num = 400, 150, 48, 4
    bg_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    image = Image.new(mode='RGB', size=(width, height), color=bg_color)
    draw = ImageDraw.Draw(image, mode='RGB')
    font = ImageFont.truetype("C:\Windows\Fonts\Gadugi.ttf", font_size)
    verify = str()
    for i in range(font_num):
        x = random.randint(i * (width / font_num) + 10, (i + 1) * (width / font_num) - font_size - 10)
        y = random.randint(20, height - font_size - 20)
        char = random.choice([chr(a) for a in range(65, 91)] + [chr(b) for b in range(97, 123)] +
                             [str(num) for num in range(10)])
        verify += char
        color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
        draw.text((x, y), char, fill=color, font=font)
    return image, verify


if __name__ == '__main__':
    image, verify = gen_verified_image()
    print(verify)
    image.show()

运行结果:

qtC7

验证码的字体一般不会使用很容易辨认的字体,可以换一个复杂一点的。除了大写字母之外,也可以把小写字母加进来。调整字符的位置避免画到画布的边缘。将代码封装到一个函数中,并将image对象和验证码字符verify作为返回值,方便调用时展示图片和进行验证。

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用PythonPIL实现滑动图片验证码,具体步骤如下: 1. 读取图片使用PIL中的Image.open()方法; 2. 计算两张图片的像素差,使用PIL中的ImageChops.difference()方法; 3. 计算滑块的位置,使用PIL中的Image.histogram()方法; 4. 移动滑块,使用Selenium中的ActionChains.drag_and_drop()方法; 5. 提交验证,使用Selenium中的WebDriver.submit()方法。 ### 回答2: Python可以使用第三方Pillow和OpenCV实现滑动图片验证码。 首先,我们需要生成一个带有滑块的验证码图片。可以使用PythonPillow生成验证码图片。我们可以使用Pillow的Image和ImageDraw模块来创建一个空白的图片,并在图片上添加文字和干扰线,然后将其中一部分作为滑块。 ```python from PIL import Image, ImageDraw # 创建一个空白图片 image = Image.new('RGB', (width, height), (255, 255, 255)) draw = ImageDraw.Draw(image) # 在图片上添加文字和干扰线 # 添加滑块 # 保存验证码图片 image.save('captcha.png') ``` 接下来,我们需要实现验证滑块位置的功能。可以使用OpenCV来处理验证码图片和滑块图片之间的关系。我们可以使用OpenCV的模板匹配算法来找出滑块在验证码图片中的位置。首先,我们需要将验证码图片和滑块图片加载进来,并将它们转换成灰度图像。然后,我们可以使用OpenCV中的matchTemplate方法来查找滑块在验证码图片中的位置。 ```python import cv2 # 加载验证码图片和滑块图片 captcha_image = cv2.imread('captcha.png') slider_image = cv2.imread('slider.png') # 将图片转换成灰度图像 captcha_gray = cv2.cvtColor(captcha_image, cv2.COLOR_BGR2GRAY) slider_gray = cv2.cvtColor(slider_image, cv2.COLOR_BGR2GRAY) # 使用模板匹配算法查找滑块在验证码图片中的位置 result = cv2.matchTemplate(captcha_gray, slider_gray, cv2.TM_CCOEFF_NORMED) # 获取滑块在验证码图片中的位置 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) ``` 最后,我们可以将找到的滑块位置作为结果返回。 ```python slider_position = max_loc[0] # 滑块在验证码图片中的横坐标位置 # 返回滑块位置 return slider_position ``` 以上是使用Python实现滑动图片验证码的简单示例。具体实现可以根据实际需求进行调整和优化。 ### 回答3: Python可以通过使用第三方实现滑动图片验证码。 首先,我们可以使用Pillow(一个Python图像处理)来加载验证码图片。可以使用`Image.open()`方法打开验证码图片。 接下来,要实现滑动验证码的功能,我们需要通过一些算法来计算滑动的距离。可以使用OpenCV(一个图像处理和计算机视觉)来处理图片并获取滑块的位置。可以使用`cv2.matchTemplate()`方法来寻找滑块的位置。 然后,我们需要通过模拟滑动动作来完成验证操作。可以使用Selenium(一个用于Web应用程序的自动化测试)来模拟用户在网页上的操作。可以使用`ActionChains`类和`draggable()`方法来模拟滑动滑块的操作。 最后,我们还可以使用Flask(一个Python web框架)来搭建一个简单的网页应用来展示滑动图片验证码,并实现滑动验证码的功能。 综上所述,通过使用Pillow加载验证码图片使用OpenCV获取滑块位置,使用Selenium模拟滑动操作,并使用Flask搭建网页应用,我们可以实现Python的滑动图片验证码功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小斌哥ge

非常感谢,祝你一切顺利。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值