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中turtle作图示例
Nov 15 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
Python实现基本数据结构中栈的操作示例
Dec 04 Python
Python代码太长换行的实现
Jul 05 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
Dec 10 Python
python plt可视化——打印特殊符号和制作图例代码
Apr 17 Python
Python新手学习装饰器
Jun 04 Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
Jul 28 Python
python Matplotlib模块的使用
Sep 16 Python
python实现调用摄像头并拍照发邮箱
Apr 27 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中ADODB类详解
2008/03/25 PHP
PHP学习笔记之数组篇
2011/06/28 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
共享自己写一个框架DreamScript
2007/01/20 Javascript
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
原生Vue 实现右键菜单组件功能
2019/12/16 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
python定时采集摄像头图像上传ftp服务器功能实现
2013/12/23 Python
python操作CouchDB的方法
2014/10/08 Python
举例讲解Python中is和id的用法
2015/04/03 Python
详解python单例模式与metaclass
2016/01/15 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
Django的分页器实例(paginator)
2017/12/01 Python
django+xadmin+djcelery实现后台管理定时任务
2018/08/14 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
介绍java中初始化块的使用
2012/09/11 面试题
急诊科护士自我鉴定
2013/10/14 职场文书
高中生自我评价个人范文
2013/11/09 职场文书
岗位廉洁从政承诺书
2014/03/27 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
三孔导游词
2015/02/05 职场文书
光荣之路观后感
2015/06/12 职场文书
爱岗敬业先进典型事迹材料(2016推荐版)
2016/02/26 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
Django使用echarts进行可视化展示的实践
2021/06/10 Python
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis