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 相关文章推荐
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
Nov 18 Python
Python循环语句中else的用法总结
Sep 11 Python
Python字典简介以及用法详解
Nov 15 Python
Tensorflow环境搭建的方法步骤
Feb 07 Python
python多线程之事件Event的使用详解
Apr 27 Python
在cmd中运行.py文件: python的操作步骤
May 12 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
Oct 11 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
Mar 24 Python
python中使用input()函数获取用户输入值方式
May 03 Python
Python turtle库的画笔控制说明
Jun 28 Python
python3爬虫GIL修改多线程实例讲解
Nov 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中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
javascript 常用方法总结
2009/06/03 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
2015/03/09 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
2019/11/13 Javascript
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
python ip正则式
2009/05/07 Python
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
python中lambda与def用法对比实例分析
2015/04/30 Python
Python制作简易注册登录系统
2016/12/15 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
天游软件面试
2013/11/23 面试题
离职报告范文
2014/11/04 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书