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 相关文章推荐
php.ini 配置文件的深入解析
Jun 17 PHP
跟我学Laravel之快速入门
Oct 15 PHP
ThinkPHP中redirect用法分析
Dec 05 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
php判断文件夹是否存在不存在则创建
Apr 09 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
Jun 24 PHP
PHP面向对象程序设计实例分析
Jan 26 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
php实现页面纯静态的实例代码
Jun 21 PHP
yii2安装详细流程
May 23 PHP
php数组遍历类与用法示例
May 24 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
Apr 14 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
PHP遍历二维数组的代码
2011/04/22 PHP
php旋转图片90度的方法
2013/11/07 PHP
PHP中常用的输出函数总结
2014/09/22 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
2012/10/11 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
js获取下拉列表的值和元素个数示例
2014/05/07 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
Bootstrap模态框调用功能实现方法
2016/09/19 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
python清除指定目录内所有文件中script的方法
2015/06/30 Python
开始着手第一个Django项目
2015/07/15 Python
Python选课系统开发程序
2016/09/02 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
Django保护敏感信息的方法示例
2019/05/09 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
Python的logging模块基本用法
2020/12/24 Python
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
教师实习自我鉴定
2013/12/13 职场文书
大学生职业规划论文
2014/01/11 职场文书
大学生毕业个人总结
2015/02/15 职场文书
大学运动会通讯稿
2015/07/18 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
使用nginx配置访问wgcloud的方法
2021/06/26 Servers
Python Django项目和应用的创建详解
2021/11/27 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python