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 27 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
浅谈Python里面小数点精度的控制
Jul 16 Python
python 处理string到hex脚本的方法
Oct 26 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
Nov 06 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
Nov 29 Python
python无限生成不重复(字母,数字,字符)组合的方法
Dec 04 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
python TK库简单应用(实时显示子进程输出)
Oct 29 Python
部署Django到阿里云服务器教程示例
Jun 03 Python
详解python with 上下文管理器
Sep 02 Python
python+opencv实现视频抽帧示例代码
Jun 11 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者的疑难问答(2)
2006/10/09 PHP
PHP 数组遍历顺序理解
2009/09/09 PHP
在字符串指定位置插入一段字符串的php代码
2010/02/16 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
PHP中的错误处理、异常处理机制分析
2012/05/07 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
基于jquery实现图片上传本地预览功能
2016/01/08 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
Selenium定位元素操作示例
2018/08/10 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
pip 安装库比较慢的解决方法(国内镜像)
2019/10/06 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
什么是GWT的Module
2013/01/20 面试题
2014教师个人自我评价范文
2014/09/13 职场文书
党员民主评议个人总结
2014/10/20 职场文书
在python中实现导入一个需要传参的模块
2021/05/12 Python
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
Python+Appium实现自动抢微信红包
2021/05/21 Python
MongoDB使用场景总结
2022/02/24 MongoDB
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js