python创建方法draw_Python做图像处理(五)---ImageDraw综合应用实例:自制验证码...

0082cd0493ed96099485bc38bdd604b0.png

前面几讲讲解了pillow库中两个最重要的模块,Image模块与ImageDraw模块,本讲小编将这两个模块综合应用起来,来制作一个随机自动生成验证码的程序。

1.生成验证码程序的算法设计原理

验证码通常用于网络,是网站为了防止恶意注册和网络机器人登录所采用的一种验证手段。验证码就是随机数字或符号生成的一幅图片,图片里加上一些干扰象素(防止OCR即光学字符识别),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能等登入系统,使用系统的某项功能。

依据验证码的生成原理,本程序的算法设计流程图如下:

e0e6591f490819f6d3399fc2346183b8.png

2.算法的实现过程

(1).首先生成背景为白色的一张image对象

imageTemp=Image.new('RGB',(200,200),

(255,255,255))

得如下一张200x200的白色背景的图片

b89cbb2c109f246a01224e0455ae3f91.png

(图一)

(2) 接下来开始利用ImageDraw模块在图片上写入随机生成的字母与数字,具体代码如下:

font=ImageFont.truetype('STHUPO.TTF',45)

draw=ImageDraw.Draw(imageTemp)

text=getCharacters(6)

width,height=draw.textsize(text,font)

#绘制验证码offset=2fori inrange(characterNumber):

offset+=width//characterNumber

position=(offset,

(size[1]-height)//2+random.randint(-10,10))

draw.text(xy=position,text=text[i],

font=font,fill=getColor())imageTemp.show()

注意:以上代码中出现了两个函数:一个是getCharacters(num)函数用于生成num个的随机字母与数字的组合字符串。代码如下

defgetCharacters(length):

result=''fori inrange(length):

result+=random.choice(characters)

returnresult

其中的characters是由所有字母+数字构成的字符串,生成方式采用python的标准库string中的方法来实现,具体实现方式为

characters=string.ascii_letters+string.digits

以上代码中出现的另一个自定义函数为getColor函数,作用是生成随机颜色。代码如下

defgetColor():

r=random.randint(0,255)

g=random.randint(0,255)

b=random.randint(0,255)

return(r,g,b)

最终,代码运行后会实现向图一中写入随机字母与数字。效果如下:

2303b25d8cec8ca61bef9367aa6e67c9.png

(3) 为了绕开OCR技术,利用ImageDraw模块向图片中写入干扰元素,包括位置与颜色均随机的像素点、直线以及曲线,具体代码如下:

#绘制干扰点fori inrange(int(size[0]*size[1]*0.03)):

draw.point((random.randint(0,size[0]),

random.randint(0,size[1])),fill=getColor())# 绘制干扰线条fori inrange(8):

start=(0,random.randint(0,size[1]-1))

end = (size[0],random.randint(0,size[1] - 1))

draw.line([start,end],fill=getColor(),width=1)

#绘制弧线fori inrange(8):

start=(-10,-10)

end = (size[0]+10,random.randint(0,size[1]+10))

draw.arc(start+end,0,270,fill=getColor(),width=1)

imageTemp.save('result.jpg')

imageTemp.show()

最终,程序运行后,效果如下图所示:

bfeda77db7a076fecec87626e16a0e68.png

当然,由于字母与数字与颜色都是随机选取的,因此,程序每运行一次效果都不一样。以下列出了一些随机的运行效果。怎么样,你也来试一试吧!

cfea8281c0aec0523ec9c6468a507ce9.png

3f2c855b3b861185c13a229b007b7811.png

5b5feb92ca7f71a1557ee9f53916b9d6.png

bfeda77db7a076fecec87626e16a0e68.png

89af5159b5e121f088597213876762dd.png

84e3af07833441ed4d7a0dfb5abd947b.pngend

796288c8666ca1332927f2ca8be0358e.png

扫码关注公众号

25271ec255bd118592b795896bff7a25.png

推荐阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java web mvc_构建Java Web应用程序时遵循MVC的三个步骤

java web mvc第1步 做 始终通过servlet / action bean处理URL(POST表单,单击链接等),而不是通过JSP处理 为什么 ActionBeans(无论某些框架调用那些类),而servlet很少是控制器 用于处理用户输入。…

unknown error mysql_mysql执行sql文件报错Error: Unknown storage engine‘InnoDB’的解决方法...

发现问题最近在工作中遇到一个问题,在运行了一个innoDB类型的sql文件,报了Error: Unknown storage engine InnoDB错误,网上查了很多方法,但是都没办法真正解决我的问题,后来解决了,在这里总结一下过程&…

JQuery 对表单进行初始化操作

提供一种如果前台页面标签比较多,如果挨个初始化的话可能会比较繁琐,这时候我们可以将后台传递的数据组装为json串,前台用jquery将代码初始化到表单中。 function loadData(jsonStr) {// alert(jsonStr.toString())var obj eval("(&qu…

Winform控件扩展

1.TextBox 增加水印 新增一个用户控件,将继承UserControl改为TextBox public partial class TextBoxEP : TextBox{public TextBoxEP(){InitializeComponent();}private const uint WT_Mark 0x1501;[DllImport("user32.dll", CharSet CharSet.Auto, SetL…

oracle 中大于等于_针对oracle安装参数调整方法

solaris针对oracle安装的shmmax参数调整方法安装数据库不能拘泥于联机文档,最近看到好几个跑oracle的sun主机上,都把和数据库内存使用相关的操作系统内核参数shmmax设置成4G,因为联机文档中“solaris系统上安装oracle”是这样写的。具体实施时…

带有JAX-WS和Spring的Web服务应用程序

1.简介 这是一个漫长的等待,但是我终于发布了一个关于使用Spring创建第一个基于SOAP的Web服务应用程序的教程。 JAX-WS (用于XML Web服务的Java API)是用于以XML格式创建Web服务的一组API,我们最常将其称为基于SOAP的Web服务 &…

mysql把一个字段加到另一张表中_mysql如何能把一个表中的某一字段下的数据加入另一个表中相同字段下,条件是两表中的某字段相同?...

1、创建表create table a (name varchar(20) not null,sex varchar(10));create table b (name varchar(20) not null,sex varchar(10));2、插入值insert into a values(john,male);insert into b values(john,male);insert into a values(kate,female);insert into b values(k…

jboss数据源配置

http://blog.csdn.net/clinique/article/details/7482670 最近项目相关的JBOSS配置开始,留下点什么 项目使用的是local-tx-datasource, 网上找了很多资料,都没有明确说明local-tx-datasource和xa-datasource的区别,而且中文的资料太少&#x…

创建虚拟环境和新建工程目录

一、创建虚拟环境 virtualenv -p python版本的路径.exe 虚拟环境名称 #新建虚拟环境 eg:virtualenv -p C:\Users\fanlala\AppData\Local\Programs\Python\Python35-32\python.exe article_spider #使用python3.5新建名为article_spider的虚拟环境。 新建完成虚…

python装饰器编程_Python编程中装饰器的使用示例解析

装饰函数和方法我们先定义两个简单的数学函数,一个用来计算平方和,一个用来计算平方差: # get square sumdef square_sum(a, b):return a**2 b**2# get square diffdef square_diff(a, b):return a**2 - b**2print(square_sum(3, 4))print(s…

mvvm 自动绑定_ZK的实际应用:MVVM –表单绑定

mvvm 自动绑定这是我们从头开始构建ZK应用程序的第二集。 上一篇文章介绍了使用MVVM将数据加载和呈现到表中。 在本文中,我们将向您介绍ZK MVVM的表单绑定。 目的 我们将构建一个“添加”功能,使我们能够将新条目保存到清单中。 单击“添加”时出现表格…

最短路和次短路问题,dijkstra算法

1 /* 2 *题目大意: 3 *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和; 4 * 5 *算法思想: 6 *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; 7 *将dist数组开成二维的,即dist[v][2],第二维分别用于记录最短…

Java EE 8 MVC:使用bean参数

在上一篇文章中&#xff0c;我们看到了如何在MVC Controller中访问query &#xff0c; path和form参数 。 这篇文章展示了如何使用BeanParam批注将多个参数映射到一个对象。 让我们重用关于表单参数的文章中的简单HTML表单&#xff1a; <form action"submit" me…

用python验证猜想之类的例子_python练手好例子:验证哥德巴赫猜想

哥德巴赫猜想是一个谜&#xff0c;但十分适合用来作为编程练习涉及的几个问题&#xff1a;1、如何验证一个数是素数 def prime(n)一个整数n不能被2 到 n \sqrt{n}n​整除&#xff0c;则为素数2、产生N以内的素数列表本文中N取100&#xff0c;可以取更大3、对于大于6的偶数&…

oracle安装及卸载总结

>>>>> oracle安装&#xff08;卸载&#xff09;教程&#xff08;来自网络&#xff09;&#xff1a;链接: http://pan.baidu.com/s/1eSzSwZC 密码: g3qn oracle_win_64安装包&#xff08;官网下的&#xff09;&#xff1a;链接: http://pan.baidu.com/s/1nvBPzkt…

mysql全表重命名备份_MySQL数据库重命名的快速且安全方法(3种)

MySQL数据库重命名的方法Innodb引擎的表如何改数据库名&#xff0c;MyISAM引擎又该如何操作。如果表是MyISAM引擎可以直接去到数据库目录mv重命名文件夹就可以。 Innodb完全不行&#xff0c;会提示相关表不存在。第一种方法&#xff1a;rename database 弃用了RENAME database …

mysql 中 and和or 一起使用和之间的优先级

SELECT address,job_title,education,SUM(recruiting) FROM commerce_jobs WHERE education 大专 and ( job_title LIKE %主管% OR job_title LIKE %组长% OR job_title LIKE %主任% OR job_title LIKE %项目经理% ) 标红部分的() 括号。and 比 or具有更高的优先级&#xff0c…

threadlocal_了解ThreadLocal背后的概念

threadlocal介绍 我知道本地线程&#xff0c;但直到最近才真正使用过它。 因此&#xff0c;我开始深入研究该主题&#xff0c;因为我需要一种传播某些用户信息的简便方法 通过Web应用程序的不同层&#xff0c;而无需更改每个调用方法的签名。 小前提信息 线程是具有自己的调…

mysql有nvarchar类型_mysql如何处理varchar与nvarchar类型中的特殊字符

如果你每次建数据表的时候固执的使用varchar&#xff0c;那么你可能会遇到以下的问题&#xff1a; 现在saleUserName的字段类型为varchar(50) update TableNameset saleUserName小覃祝你快乐 where ID87 select * from TableName where ID87 whySaleUserName字段里的文字怎么如…

linux 文件的压缩和打包

在我们的生活中&#xff0c;经常会和朋友、同事、客户发一些文件。为了能够更加快速、高效的将文件传递出去&#xff0c;经常会用到压缩工具。压缩工具通过一定的算法&#xff0c;把数据给尽可能的缩小。这样不仅方便传递、而且可以节省空间。有时候我们需要把一些零散的文件集…