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 学习笔记
Dec 27 Python
在Python下利用OpenCV来旋转图像的教程
Apr 16 Python
Python实现股市信息下载的方法
Jun 15 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
Python3结合Dlib实现人脸识别和剪切
Jan 24 Python
详解python校验SQL脚本命名规则
Mar 22 Python
Django框架会话技术实例分析【Cookie与Session】
May 24 Python
opencv3/C++实现视频背景去除建模(BSM)
Dec 11 Python
Pytorch在NLP中的简单应用详解
Jan 08 Python
jupyter notebook参数化运行python方式
Apr 10 Python
keras 指定程序在某块卡上训练实例
Jun 22 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 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 smarty的预保留变量总结
2008/12/04 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
javascript中的作用域scope介绍
2010/12/28 Javascript
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
基于Bootstrap仿淘宝分页控件实现代码
2016/11/07 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
微信小程序云开发 搭建一个管理小程序
2019/05/17 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
pycharm 使用心得(四)显示行号
2014/06/05 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
pandas分区间,算频率的实例
2019/07/04 Python
一行python实现树形结构的方法
2019/08/09 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
python 使用openpyxl读取excel数据
2021/02/18 Python
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
进程的查看和调度分别使用什么命令
2015/03/25 面试题
毕业生自荐书模版
2014/01/04 职场文书
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
工作散漫检讨书
2014/09/16 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
六五普法心得体会2016
2016/01/21 职场文书
Hive日期格式转换方法总结
2022/06/25 数据库