python PIL模块与随机生成中文验证码


Posted in Python onFebruary 27, 2016

在这之前,你首先得了解Python中的PIL库。PIL是Python Imaging Library的简称,PIL是一个Python处理图片的库,提供了一系列模块和方法,比如:裁切,平移,旋转,改变尺寸等等。在PIL库中,任何一个图像都是用Image对象来表示的,所以要加载一张图片,最简单的形式如下:

from PIL import Image
image = Image.open("1.jpeg")

在PIL库中,最常用的模块有Image,ImageDraw,ImageEnhance,ImageFile等。
PIL的下载地址为:http://www.pythonware.com/products/pil/
接下来学习PIL中一些常见的操作:

(1)改变图片大小

from PIL import Image

image = Image.open("1.jpeg")
new_img = image.resize((256,256),Image.BILINEAR)
new_img.save("2.jpeg")

(2)旋转图片

from PIL import Image

image = Image.open("1.jpeg")
new_img = image.rotate(45)
new_img.save("2.jpeg")

(3)直线绘制

PIL库中的ImageDraw模块提供了图形绘制的基本功能,可以绘制直线,弧线,椭圆,矩形等等。

from PIL import Image,ImageDraw

image = Image.open("2.jpeg")
draw = ImageDraw.Draw(image)
width,height = image.size
draw.line(((0,0),(width-1,height-1)),fill=255)
draw.line(((0,height-1),(width-1,0)),fill=255)
image.save("2.jpeg")

(4)绘制圆

from PIL import Image,ImageDraw

image = Image.open("2.jpeg")
draw = ImageDraw.Draw(image)
width,height = image.size
draw.arc((0,0,width-1,height-1),0,360,fill=255)
image.save("2.jpeg")

更多方法可以参见帮助文档。

现在我们来研究利用Python如何生成中文验证码。其实这个问题简单,我们都知道验证码一般是用来防止网络机器

人采用无限次数的登录尝试破解密码,那么我们需要对这张图片随机生成中文字符来验证,一般来说会把图片的字表

现得很模糊,这样有效地防止机器人识别。所以我们除了要随机生成汉字,还要加入一些干扰线条等等。

# -*- coding: utf-8 -*-
from PIL import Image,ImageDraw,ImageFont
import random
import math, string 

class RandomChar():
 @staticmethod
 def Unicode():
  val = random.randint(0x4E00, 0x9FBF)
  return unichr(val) 

 @staticmethod
 def GB2312():
  head = random.randint(0xB0, 0xCF)
  body = random.randint(0xA, 0xF)
  tail = random.randint(0, 0xF)
  val = ( head << 8 ) | (body << 4) | tail
  str = "%x" % val
  return str.decode('hex').decode('gb2312') 

class ImageChar:
 def __init__(self, fontColor = (0, 0, 0),
           size = (100, 40),
           fontPath = 'SIMSUN.TTC',
           bgColor = (255, 255, 255),
           fontSize = 20):
  self.size = size
  self.fontPath = fontPath
  self.bgColor = bgColor
  self.fontSize = fontSize
  self.fontColor = fontColor
  self.font = ImageFont.truetype(self.fontPath, self.fontSize)
  self.image = Image.new('RGB', size, bgColor) 

 def rotate(self):
  self.image.rotate(random.randint(0, 30), expand=0) 

 def drawText(self, pos, txt, fill):
  draw = ImageDraw.Draw(self.image)
  draw.text(pos, txt, font=self.font, fill=fill)

 def randRGB(self):
  return (random.randint(0, 255),
      random.randint(0, 255),
      random.randint(0, 255)) 

 def randPoint(self):
  (width, height) = self.size
  return (random.randint(0, width), random.randint(0, height)) 

 def randLine(self, num):
  draw = ImageDraw.Draw(self.image)
  for i in range(0, num):
   draw.line([self.randPoint(), self.randPoint()], self.randRGB())

 def randChinese(self, num):
  gap = 5
  start = 0
  for i in range(0, num):
   char = RandomChar().GB2312()
   x = start + self.fontSize * i + random.randint(0, gap) + gap * i
   self.drawText((x, random.randint(-5, 5)), RandomChar().GB2312(), self.randRGB())
   self.rotate()
  self.randLine(18) 

 def save(self, path):
  self.image.save(path)

ic = ImageChar(fontColor=(100,211, 90))
ic.randChinese(4)
ic.save("1.jpeg")

运行结果:

python PIL模块与随机生成中文验证码

Python 相关文章推荐
零基础写python爬虫之urllib2使用指南
Nov 05 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
python判断完全平方数的方法
Nov 13 Python
python文件处理fileinput使用方法详解
Jan 02 Python
python IDLE添加行号显示教程
Apr 25 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
Pytorch 使用 nii数据做输入数据的操作
May 26 Python
Python实现在线批量美颜功能过程解析
Jun 10 Python
基于keras中的回调函数用法说明
Jun 17 Python
浅谈keras中loss与val_loss的关系
Jun 22 Python
协程Python 中实现多任务耗资源最小的方式
Oct 19 Python
pandas DataFrame.shift()函数的具体使用
May 24 Python
Pythont特殊语法filter,map,reduce,apply使用方法
Feb 27 #Python
python 网络爬虫初级实现代码
Feb 27 #Python
Python数据库的连接实现方法与注意事项
Feb 27 #Python
学习python之编写简单简单连接数据库并执行查询操作
Feb 27 #Python
学习python之编写简单乘法口诀表实现代码
Feb 27 #Python
学习python 之编写简单乘法运算题
Feb 27 #Python
python学习之编写查询ip程序
Feb 27 #Python
You might like
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
thinkphp特殊标签用法概述
2014/11/24 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
jquery插件开发之实现md5插件
2014/03/17 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
2016/08/01 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
微信小程序按钮点击跳转页面详解
2019/05/06 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
python中ConfigParse模块的用法
2014/09/29 Python
Python与R语言的简要对比
2017/11/14 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
2019/08/19 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
python爬虫基础之urllib的使用
2020/12/31 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
中专毕业生自我鉴定范文
2013/11/09 职场文书
怎样填写就业意向
2014/04/02 职场文书
拔河比赛口号
2014/06/10 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
公务员爱岗敬业心得体会
2016/01/25 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书