PHP编写的图片验证码类文件分享


Posted in PHP onJune 06, 2016

适用于自定义的验证码类!

<?php
 
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
Class Image{
   
  private $img;
  public $width = 85;
  public $height = 25;
  public $code;
  public $code_len = 4;
  public $code_str = "329832983DSDSKDSLKQWEWQ2lkfDSFSDjfdsfdsjwlkfj93290KFDSKJFDSOIDSLK";
  public $bg_color = '#DCDCDC';
  public $font_size = 16;
  public $font = 'font.ttf';
  public $font_color = '#000000';
   
  //创建验证码饿字符创
  public function create_code(){
    $code = '';
    for( $i=0;$i<$this->code_len;$i++ ){
      $code .= $this->code_str[mt_rand(0, strlen($this->code_str)-1)];
  }
    return $this->code = $code;
  }
   
  //输出图像
  public function getImage(){
    $w = $this->width;
    $h = $this->height;
    $bg_color = $this->bg_color;
    $img = imagecreatetruecolor($w, $h);
    $bg_color = imagecolorallocate($img, 
  hexdec(substr($bg_color, 1,2)), hexdec(substr($bg_color, 3,2)), hexdec(substr($bg_color, 5,2)));
  imagefill($img, 0, 0, $bg_color);
    $this->img = $img;
    $this->create_font();
    $this->create_pix();
  $this->show_code();
  }
 
 
  //写入验证码
  public function create_font(){
    $this->create_code();
    $color = $this->font_color;
    $font_color = imagecolorallocate($this->img, hexdec(substr($color,1,2)), hexdec(substr($color, 3,2)), hexdec(substr($color,5,2)));
    $x = $this->width/$this->code_len;
    for( $i=0;$i<$this->code_len;$i++ ){
      $txt_color = imagecolorallocate($this->img, mt_rand(0,100), mt_rand(0, 150), mt_rand(0, 200));
      imagettftext($this->img, $this->font_size, mt_rand(-30, 30), $x*$i+mt_rand(3, 6), mt_rand($this->height/1.2, $this->height), $txt_color, $this->font , $this->code[$i]); 
      //imagestring($this->img, $this->font_size, $x*$i+mt_rand(3, 6),mt_rand(0, $this->height/4) , $this->code[$i], $font_color);
    }
    $this->font_color = $font_color;
  }
   
  //画干扰线
  public function create_pix(){
    $pix_color= $this->font_color;
    for($i=0;$i<100;$i++){
      imagesetpixel($this->img, mt_rand(0, $this->width),mt_rand(0, $this->height), $pix_color);
    }
    for($j=0;$j<4;$j++){
      imagesetthickness($this->img, mt_rand(1, 2));
      imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $pix_color);
    }
  }
   
  //得到验证码
  public function getCode(){
    return strtoupper($this->code);
  }
 
 
  //输出验证码
  private function show_code(){
    header("Content-type:image/png");
    imagepng($this->img);
    imagedestroy($this->img);
  }
}

我们再来看一例代码:

生成图片类型验证码,验证码包含数字和大写字母,session中存放md5加密后的验证码

<?php
/**
 * 图片验证码类
 * 生成图片类型验证码,验证码包含数字和大写字母,session中存放md5加密后的验证码
 * 
 * 使用方法:
 * $captcha = new Catpcha();
 * $captcha->buildAndExportImage();
 * 
 * 作     者: luojing
 * 创建时间: 2013-3-27 上午11:42:12
 */
class Captcha {
	
	private $width;//宽度
	private $height; //高度
	private $codeNum;//验证码字符数量
	private $image;//验证码图像资源
	private $sessionKey;//session中保存的名字
	private $captcha;//验证码字符串
	const charWidth = 10;//单个字符宽度,根据输出字符大小而变
	
	/**
	 * 创建验证码类,初始化相关参数
	 * @param $width 图片宽度
	 * @param $height 图片高度
	 * @param $codeNum 验证码字符数量
	 * @param $sessionKey session中保存的名字
	 */
	function __construct($width = 50, $height = 20, $codeNum = 4, $sessionKey = 'captcha') {
		$this->width = $width;
		$this->height = $height;
		$this->codeNum = $codeNum;
		$this->sessionKey = $sessionKey;
		
		//保证最小高度和宽度
		if($height < 20) {
			$this->height = 20;
		}
		if($width < ($codeNum * self::charWidth + 10)) {//左右各保留5像素空隙
			$this->width = $codeNum * self::charWidth + 10;
		}
	}
	
	/**
	 * 构造并输出验证码图片
	 */
	public function buildAndExportImage() {
		$this->createImage();
		$this->setDisturb();
		$this->setCaptcha();
		$this->exportImage();
	}
	
	/**
	 * 构造图像,设置底色
	 */
	private function createImage() {
		//创建图像
		$this->image = imagecreatetruecolor($this->width, $this->height); 
		//创建背景色
		$bg = imagecolorallocate($this->image, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255)); 
		//填充背景色
		imagefilledrectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $bg);
	}
	
	/**
	 * 设置干扰元素
	 */
	private function setDisturb() {
		
		//设置干扰点
		for($i = 0; $i < 150; $i++) {
			$color = imagecolorallocate($this->image, mt_rand(150, 200), mt_rand(150, 200), mt_rand(150, 200));
			imagesetpixel($this->image, mt_rand(5, $this->width - 10), mt_rand(5, $this->height - 3), $color);
		}
		
		//设置干扰线
		for($i = 0; $i < 10; $i++) {
			$color = imagecolorallocate($this->image, mt_rand(150, 220), mt_rand(150, 220), mt_rand(150, 220));
			imagearc($this->image, mt_rand(-10, $this->width), mt_rand(-10, $this->height), mt_rand(30, 300), mt_rand(20, 200), 55, 44, $color);
		}
		
		//创建边框色
		$border = imagecolorallocate($this->image, mt_rand(0, 50), mt_rand(0, 50), mt_rand(0, 50));
		//画边框
		imagerectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $border);
	}
	
	/**
	 * 产生并绘制验证码
	 */
	private function setCaptcha() {
		$str = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
		//生成验证码字符
		for($i = 0; $i < $this->codeNum; $i++) {
			$this->captcha .= $str{mt_rand(0, strlen($str) - 1)};
		}
		//绘制验证码
		for($i = 0; $i < strlen($this->captcha); $i++) {
			$color = imagecolorallocate($this->image, mt_rand(0, 200), mt_rand(0, 200), mt_rand(0, 200));
			$x = floor(($this->width - 10)/$this->codeNum);
			$x = $x*$i + floor(($x-self::charWidth)/2) + 5;
			$y = mt_rand(2, $this->height - 20);
			imagechar($this->image, 5, $x, $y, $this->captcha{$i}, $color);
		}
	}
	
	/*
	 * 输出图像,验证码保存到session中
	 */
	private function exportImage() {
		if(imagetypes() & IMG_GIF){
			header('Content-type:image/gif');
			imagegif($this->image);
		} else if(imagetypes() & IMG_PNG){
			header('Content-type:image/png'); 
     	imagepng($this->iamge);
		} else if(imagetypes() & IMG_JPEG) {
			header('Content-type:image/jpeg'); 
     	imagepng($this->iamge);
		} else {
			imagedestroy($this->image);
			die("Don't support image type!");
		}
		//将验证码信息保存到session中,md5加密
		if(!isset($_SESSION)){
  		session_start();
		} 
		$_SESSION[$this->sessionKey] = md5($this->captcha);
		
    imagedestroy($this->image); 
	}
	
	function __destruct() {
		unset($this->width, $this->height, $this->codeNum,$this->captcha);
	}
}

例三:

<?php
 class ValidationCode {
 private $width;
 private $height;
 private $codeNum;
 private $image;  //图像资源
 private $disturbColorNum;
 private $checkCode;
 function __construct($width=80, $height=20, $codeNum=4){
  $this->width=$width;
  $this->height=$height;
  $this->codeNum=$codeNum;
  $this->checkCode=$this->createCheckCode();
  $number=floor($width*$height/15);
 
  if($number > 240-$codeNum){
  $this->disturbColorNum= 240-$codeNum;
  }else{
  $this->disturbColorNum=$number;
  }
 
 }
 //通过访问该方法向浏览器中输出图像
 function showImage($fontFace=""){
  //第一步:创建图像背景
  $this->createImage();
  //第二步:设置干扰元素
  $this->setDisturbColor();
  //第三步:向图像中随机画出文本
  $this->outputText($fontFace);
  //第四步:输出图像
  $this->outputImage();
 }
 
 //通过调用该方法获取随机创建的验证码字符串
 function getCheckCode(){
  return $this->checkCode;
 }
 private function createImage(){
  //创建图像资源
  $this->image=imagecreatetruecolor($this->width, $this->height);
  //随机背景色
  $backColor=imagecolorallocate($this->image, rand(225, 255), rand(225,255), rand(225, 255));
  //为背景添充颜色
  imagefill($this->image, 0, 0, $backColor);
  //设置边框颜色
  $border=imagecolorallocate($this->image, 0, 0, 0);
  //画出矩形边框
  imagerectangle($this->image, 0, 0, $this->width-1, $this->height-1, $border);
 }
 private function setDisturbColor(){
  for($i=0; $i<$this->disturbColorNum; $i++){
  $color=imagecolorallocate($this->image, rand(0, 255), rand(0, 255), rand(0, 255));
  imagesetpixel($this->image, rand(1, $this->width-2), rand(1, $this->height-2), $color);
  }
  for($i=0; $i<10; $i++){
  $color=imagecolorallocate($this->image, rand(200, 255), rand(200, 255), rand(200, 255));
  imagearc($this->image, rand(-10, $this->width), rand(-10, $this->height), rand(30, 300), rand(20, 200), 55, 44, $color);
  }
 }
 private function createCheckCode(){

//这里主要产生随机码,从2开始是为了区分1和l
  $code="23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKMNPQRSTUVWXYZ";
  $string='';
  for($i=0; $i < $this->codeNum; $i++){
  $char=$code{rand(0, strlen($code)-1)};
  $string.=$char;
  }
  return $string;
 }
 private function outputText($fontFace=""){
  for($i=0; $i<$this->codeNum; $i++){
  $fontcolor=imagecolorallocate($this->image, rand(0, 128), rand(0, 128), rand(0, 128));
  if($fontFace==""){
   $fontsize=rand(3, 5);
   $x=floor($this->width/$this->codeNum)*$i+3;
   $y=rand(0, $this->height-15);
   imagechar($this->image,$fontsize, $x, $y, $this->checkCode{$i},$fontcolor);
  }else{
   $fontsize=rand(12, 16);
   $x=floor(($this->width-8)/$this->codeNum)*$i+8;
   $y=rand($fontSize+5, $this->height);
   imagettftext($this->image,$fontsize,rand(-30, 30),$x,$y ,$fontcolor, $fontFace, $this->checkCode{$i});
  }
  }
 }
 private function outputImage() {
  if(imagetypes() & IMG_GIF){
  header("Content-Type:image/gif");
  imagepng($this->image);
  }else if(imagetypes() & IMG_JPG){
  header("Content-Type:image/jpeg");
  imagepng($this->image);
  }else if(imagetypes() & IMG_PNG){
  header("Content-Type:image/png");
  imagepng($this->image);
  }else if(imagetypes() & IMG_WBMP){
  header("Content-Type:image/vnd.wap.wbmp");
  imagepng($this->image);
  }else{
  die("PHP不支持图像创建");
  }
 }
 function __destruct(){
  imagedestroy($this->image);
 }
 }

使用如下:

测试,调用验证码类
code.php

<?php
session_start();
include "validationcode.class.php";
$code=new ValidationCode(80, 20, 4);
$code->showImage();  //输出到页面中供 注册或登录使用
$_SESSION["code"]=$code->getCheckCode(); //将验证码保存到服务器中
PHP 相关文章推荐
实用函数10
Nov 08 PHP
PHP 编写大型网站问题集
May 07 PHP
zf框架的registry(注册表)使用示例
Mar 13 PHP
PHP读取大文件的类SplFileObject使用介绍
Apr 09 PHP
PHP 快速排序算法详解
Nov 10 PHP
PHP MVC框架路由学习笔记
Mar 02 PHP
php将html转为图片的实现方法
May 19 PHP
利用PHP判断是否是连乘数字串的方法示例
Jul 03 PHP
在php的yii2框架中整合hbase库的方法
Sep 20 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
Jul 01 PHP
laravel 执行迁移回滚示例
Oct 23 PHP
php多进程中的阻塞与非阻塞操作实例分析
Mar 04 PHP
Laravel框架实现发送短信验证功能代码
Jun 06 #PHP
JSON字符串传到后台PHP处理问题的解决方法
Jun 05 #PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
Jun 05 #PHP
php 如何获取文件的后缀名
Jun 05 #PHP
PHP常用文件操作函数和简单实例分析
Jun 03 #PHP
PHP读取大文件末尾N行的高效方法推荐
Jun 03 #PHP
PHP中读取文件的几个方法总结(推荐)
Jun 03 #PHP
You might like
微信公众号实现会员卡领取功能
2017/06/08 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
2013/06/13 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
分享jQuery封装好的一些常用操作
2016/07/28 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
js实现tab切换效果
2017/02/16 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
分享Python字符串关键点
2015/12/13 Python
python中set常用操作汇总
2016/06/30 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
Python图像处理PIL各模块详细介绍(推荐)
2019/07/17 Python
python 决策树算法的实现
2020/10/09 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
python从Oracle读取数据生成图表
2020/10/14 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
Django中使用Celery的方法步骤
2020/12/07 Python
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
某科技软件测试面试题
2013/05/19 面试题
考试不及格检讨书
2014/01/09 职场文书
商铺租房协议书范本
2014/12/04 职场文书
党校毕业个人总结
2015/02/28 职场文书