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统计文本字符串里单词出现频率的方法
May 26 Python
Python字符串转换成浮点数函数分享
Jul 24 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
Apr 02 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
python 堆和优先队列的使用详解
Mar 05 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 Python
django+echart数据动态显示的例子
Aug 12 Python
如何基于Python获取图片的物理尺寸
Nov 25 Python
jupyter notebook清除输出方式
Apr 10 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
Jun 22 Python
Python语言中的数据类型-序列
Feb 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
php加密解密字符串示例
2016/10/13 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
vue修改Element的el-table样式的4种方法
2020/09/17 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
python获取元素在数组中索引号的方法
2015/07/15 Python
python常用知识梳理(必看篇)
2017/03/23 Python
python实现Adapter模式实例代码
2018/02/09 Python
详解TensorFlow查看ckpt中变量的几种方法
2018/06/19 Python
python分布式编程实现过程解析
2019/11/08 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
Python 必须了解的5种高级特征
2020/09/10 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
css3 2D图片转动样式可以扩充到Js当中
2014/04/29 HTML / CSS
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
公务员诚信承诺书
2014/05/26 职场文书
物流管理专业求职信
2014/05/29 职场文书
学生偷窃检讨书
2014/09/25 职场文书
团代会闭幕词
2015/01/28 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
2015年路政工作总结
2015/05/22 职场文书
员工手册董事长致辞
2015/07/29 职场文书
中秋节主题班会
2015/08/14 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
Nginx反向代理学习实例教程
2021/10/24 Servers