看一下做出来的验证码长啥样

验证码分析

1. 有很多点

2. 有很多线条

3. 有字母,有数字

需要用到的模块:

1. random

2. Pillow  (python3中使用pillow)

安装pillow :  pip install pillow

pillow的用法:

创建一张图片:

from PIL import Image, ImageDraw, ImageFont, ImageFilter

img = Image.new("RGB", (150,50), (255,255,255))

使用Image.net()方法创建一张图片,“RGB”是指RGB格式的图片, (150,50)指图片的长和高, (255,255,255)是RGB对应的值就是颜色。

在图片上随机画点:

draw.point(
( random.randint(0,150), random.randint(0,150)), #坐标
fill = (0,0,0) #颜色
)

画点,需要给出点的坐标,就是在什么地方画,坐标怎么算? 图片左上角坐标为(0, 0)

在图片上随机画线条:

draw.line(
[
(random.randint(0,150), random.randint(0,150), #起点
(random.randint(0,150), random.randint(0,150), #终点
],
fill = (0,0,0) #颜色
)

画线条,需要两个坐标,起点和终点

在图片上写helloworld:

font = ImageFont.truetype("simsun.ttc", 24)   #字体,两个参数,字体,字号
draw.text(5,5), "helloworld", font=font, fill="green") #文字左上角位置,内容,字体, 颜色

text(5,5)是第一个字左上角的坐标

random的用法

这里主要使用randint和sample两个方法

取随机数

import random

random.randint(1, 9)    #从1-9中随机取一个数

从列表中随机取数

>>> li = ['a','b','c',1,3,5,6]
>>> random.sample(li,5)
[6, 3, 'b', 'a', 1]

从列表li中随机取出5个数

下面是完整代码

from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random class Picture(object):
def __init__(self, text_str, size, background):
'''
text_str: 验证码显示的字符组成的字符串
size: 图片大小
background: 背景颜色
'''
self.text_list = list(text_str)
self.size = size
self.background = background def create_pic(self):
'''
创建一张图片
'''
self.width, self.height = self.size
self.img = Image.new("RGB", self.size, self.background)
#实例化画笔
self.draw = ImageDraw.Draw(self.img) def create_point(self, num, color):
'''
num: 画点的数量
color: 点的颜色
功能:画点
'''
for i in range(num):
self.draw.point(
(random.randint(0, self.width), random.randint(0,self.height)),
fill = color
) def create_line(self, num, color):
'''
num: 线条的数量
color: 线条的颜色
功能:画线条
'''
for i in range(num):
self.draw.line(
[
(random.randint(0, self.width), random.randint(0, self.height)),
(random.randint(0, self.width), random.randint(0, self.height))
],
fill = color
) def create_text(self, font_type, font_size, font_color, font_num, start_xy):
'''
font_type: 字体
font_size: 文字大小
font_color: 文字颜色
font_num: 文字数量
start_xy: 第一个字左上角坐标,元组类型,如 (5,5)
功能: 画文字
'''
font = ImageFont.truetype(font_type, font_size)
self.draw.text(start_xy, " ".join(random.sample(self.text_list, font_num)), font=font, fill=font_color) def opera(self):
'''
功能:给画出来的线条,文字,扭曲一下,缩放一下,位移一下,滤镜一下。
就是让它看起来有点歪,有点扭。
'''
params = [
1 - float(random.randint(1,2)) / 100,
0,
0,
0,
1 - float(random.randint(1,10)) / 100,
float(random.randint(1,2)) / 500,
0.001,
float(random.randint(1,2)) / 500
]
self.img = self.img.transform(self.size, Image.PERSPECTIVE, params)
self.img = self.img.filter(ImageFilter.EDGE_ENHANCE_MORE) if __name__ == "__main__":
strings = "abcdefghjkmnpqrstwxyz23456789ABCDEFGHJKLMNPQRSTWXYZ"
size = (150,50)
background = 'white'
pic = Picture(strings, size, background)
pic.create_pic()
pic.create_point(500, (220,220,220))
pic.create_line(30, (220,220,220))
pic.create_text("simsun.ttc", 24, (0,0,205), 5, (7,7))
pic.opera()
pic.img.show()

用python做一个图片验证码的更多相关文章

  1. 媳妇儿喜欢玩某音中的动漫特效,那我就用python做一个图片转化软件。

    ​    最近某音上的动漫特效特别火,很多人都玩着动漫肖像,我媳妇儿也不例外.看着她这么喜欢这个特效,我决定做一个图片处理工具,这样媳妇儿的动漫头像就有着落了.编码    为了快速实现我们的目标,我们 ...

  2. Python 实现简单图片验证码登录

    朋友说公司要在测试环境做接口测试,登录时需要传入正确的图片的验证码,本着懒省事的原则,推荐他把测试环境的图片验证码写死,我们公司也是这么做的^_^.劝说无果/(ㄒoㄒ)/~~,只能通过 OCR 技术来 ...

  3. 用Python做一个知乎沙雕问题总结

    用Python做一个知乎沙雕问题总结 松鼠爱吃饼干2020-04-01 13:40 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以 ...

  4. 使用python做一个IRC在线下载器

    使用python做一个IRC在线下载器 1.开发流程 2.软件流程 3.开始 3.0 准备工作 3.1寻找API接口 3.2 文件模块 3.2.1 选择文件弹窗 3.2.2 提取文件名 3.2.2.1 ...

  5. 【转】Python OCR识别图片验证码

    转载自:博客 对于某些网站登录的时候,往往需要输入验证码才能实现登录.如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据.以下介绍一种比较折中的方法,也是比较可行的方法: 实现思想: 1.通过截 ...

  6. 【python】带图片验证码的登录自动化实战

    近期在跟进新项目的时候,整体的业务线非常之长,会一直重复登录退出不同账号的这个流程,所以想从登录开始实现部分的自动化.因为是B/S的架构,所以采用的是selenium的框架来实现.大致实现步骤如下: ...

  7. 在树莓派上用 python 做一个炫酷的天气预报

    教大家如何在树莓派上自己动手做一个天气预报.此次教程需要大家有一定的python 基础,没有也没关系,文末我会放出我已写好的代码供大家下载. 首先在开始之前 需要申请高德地图API,去高德地图官网注册 ...

  8. 用Python做一个简单的翻译工具

    编程本身是跟年龄无关的一件事,不论你现在是十四五岁,还是四五十岁,如果你热爱它,并且愿意持续投入其中,必定会有所收获. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过 ...

  9. VUE2.0+VUE-Router做一个图片上传预览的组件

    之前发了一篇关于自己看待前端组件化的文章,但是由于学习和实践的业务逻辑差异,所以自己练习的一些demo逻辑比较简单,打算用vue重构现在公司做的项目,所以在一些小的功能页面上使用vue来做的,现在写的 ...

随机推荐

  1. Hadoop生态圈-Flume的组件之sink处理器

    Hadoop生态圈-Flume的组件之sink处理器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.

  2. 【原创】backbone1.1.0源码解析之Events

    最近在看些node的源代码,发现backbone的应用还是挺广泛的,但是之前的学习忘得一干二净了,后悔当时没做笔记啊. 所以,无奈想用的更好,就是得把源代码看楚,所以还是把源代码的注释笔记留下来,供自 ...

  3. html5 canvas 水平渐变描边

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. thinkphp5学习总结!

    数据库操作之原生sql操作 <?php namespace app\index\controller; use think\Db; class Index { public function i ...

  5. Js表单验证控件

    演示地址:http://weishakeji.net/Utility/Verify/Index.htm    开源地址:https://github.com/weishakeji/Verify_Js ...

  6. ocky勒索软件恶意样本分析1

    locky勒索软件恶意样本分析1 1 locky勒索软件构成概述 前些时期爆发的Locky勒索软件病毒这边也拿到了一个样本,简要做如下分析.样本主要包含三个程序: A xx.js文件:Jscript脚 ...

  7. 洛谷 P4656: LOJ 2484: [CEOI2017]Palindromic Partitions

    菜菜只能靠写简单字符串哈希维持生活. 题目传送门:LOJ #2484. 题意简述: 题面讲得很清楚了. 题解: 很显然从两边往中间推,能选的就选上这个贪心策略是对的. 如何判断能不能选上,直接字符串哈 ...

  8. Virut.ce-感染型病毒分析报告

    1.样本概况 病毒名称 Virus.Win32.Virut.ce MD5 6A500B42FC27CC5546079138370C492F 文件大小 131 KB (134,144 字节) 壳信息 无 ...

  9. 使用java如何操作elasticsearch?简单示例。

    在线API:https://www.elastic.co/guide/en/elasticsearch/client/java-api/2.4/transport-client.html教程:http ...

  10. Ibatis.Net 表连接查询学习(五)

    IBatis.Net之多表查询 一.定制实际对应类的方式 首先配置多表的测试数据库,在之前Person表中增加一列"CountryId",新建一张Country表,两张表关系如下: ...