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绘制常用的图表
Aug 27 Python
Python随机数用法实例详解【基于random模块】
Apr 18 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
Python正则表达式指南 推荐
Oct 09 Python
Python数据类型之Tuple元组实例详解
May 08 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
python变量的作用域是什么
May 26 Python
python GUI模拟实现计算器
Jun 22 Python
python 读取.nii格式图像实例
Jul 01 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
Jul 28 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 Python
Python使用pandas导入csv文件内容的示例代码
Dec 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
Zend Framework页面缓存实例
2014/06/25 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
php redis setnx分布式锁简单原理解析
2020/10/23 PHP
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
2016/11/22 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
JavaScript设计模式之代理模式简单实例教程
2018/07/03 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
Python常见数据类型转换操作示例
2019/05/08 Python
树莓派采用socket方式文件传输(python)
2019/06/22 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
python的json包位置及用法总结
2020/06/21 Python
Python如何定义接口和抽象类
2020/07/28 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
Python之字典对象的几种创建方法
2020/09/30 Python
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
Oracle快照(snapshot)
2015/03/13 面试题
怎样有效的进行自我评价
2013/10/06 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
股东合作协议书
2014/04/14 职场文书