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翻译软件实现代码(使用google api完成)
Nov 26 Python
Python兔子毒药问题实例分析
Mar 05 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
Python爬虫学习之翻译小程序
Jul 30 Python
详解Python打包分发工具setuptools
Aug 05 Python
python创建子类的方法分析
Nov 28 Python
Django Form and ModelForm的区别与使用
Dec 06 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
Feb 06 Python
解决使用python print打印函数返回值多一个None的问题
Apr 09 Python
Python 机器学习工具包SKlearn的安装与使用
May 14 Python
Python 用户输入和while循环的操作
May 23 Python
Python实现打乒乓小游戏
Sep 25 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 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
jquery蒙版控件实现代码
2010/12/08 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
jquery 笔记 事件
2011/11/02 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
laravel5.3 vue 实现收藏夹功能实例详解
2018/01/21 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
python基础教程之数字处理(math)模块详解
2014/03/25 Python
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
使用Python读取大文件的方法
2018/02/11 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
中科软笔试题和面试题
2014/10/07 面试题
项目考察欢迎辞
2014/01/17 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
《比尾巴》教学反思
2016/02/24 职场文书