GD实战开发验证码

GD

GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,在网站上GD库通常用来生成缩略图,或者用来对图片加水印,或者用来生成汉字验证码,或者对网站数据生成报表等;

今天benny带领大家学习并分享一个生成验证码类。

设置Captcha类属性

作为一个普通的验证码,它由以下几个方面组成:

验证码:public $checkcode; //产生的验证码验证码图片:private $checkimage; //验证码图片 图片的宽高和验证码个数:private $width=80,$height=20,$codenum=4;(默认取值) 干扰元素: private $disturbColor = ''; //干扰像素 出于安全性考虑的session:private $session_flag;

相关属性设置完后,得:

class Captcha
{
  private $width=80,$height=20,$codenum=4;
  public $checkcode; //产生的验证码
  private $checkimage; //验证码图片
  private $disturbColor = ''; //干扰像素
  private $session_flag='captcha_code';//存到session中的索引
//尝试开始session
  function __construct(){
    @session_start();
  }
 function __destruct
  {
    unset($this->width,$this->height,$this->codenum,$this->session_flag);
  }
}

PS: construct()和destruct()为构造函数和析构函数。

根据需求写方法

生成验证码

(如未显示全,可右滑)
private function createCode()
  {
    $this->checkcode = strtoupper(substr(md5(rand()),0,$this->codenum));
  }

substr() 函数返回字符串的一部分。 详细查看:http://www.w3school.com.cn/php/funcstringsubstr.asp

产生验证码图片

(如未显示全,可右滑)
private function createImage()
  {
    $this->checkimage = @imagecreate($this->width,$this->height);
    $back = imagecolorallocate($this->checkimage,255,255,255);
    $border = imagecolorallocate($this->checkimage,0,0,0);
    imagefilledrectangle($this->checkimage,0,0,$this->width - 1,$this->height - 1,$back); // 白色底
    imagerectangle($this->checkimage,0,0,$this->width - 1,$this->height - 1,$border); // 黑色边框
  }

imagecreate:新建一个基于调色板的图像 imagecolorallocate:为一幅图像分配颜色 imagefilledrectangle:画一矩形并填充 imagerectangle: 画一个单一像素

(如未显示全,可右滑)
PS:这些函数可以感觉英语单词来理解它的功能:如image+filled+rectangle = imagesfillledrectangle
详细查看:http://php.net/manual/zh/book.image.php

设置图片的干扰像素

(如未显示全,可右滑)
private function setDisturbColor()
  {
    for ($i=0;$i<=200;$i++)
    {
      $this->disturbColor = imagecolorallocate($this->checkimage, rand(0,255), rand(0,255), rand(0,255));
      imagesetpixel($this->checkimage,rand(2,128),rand(2,38),$this->disturbColor);
    }
  }

PS:干扰元素其实就是随机在一个区域内画上不同颜色的点,但是视觉上不影响验证码显示

画上验证码

(如未显示全,可右滑)
private function writeCheckCodeToImage()
  {
    for ($i=0;$i<$this->codenum;$i++)
    {
      $bg_color = imagecolorallocate ($this->checkimage, rand(0,255), rand(0,128), rand(0,255));
      $x = floor($this->width/$this->codenum)*$i;
      $y = rand(0,$this->height-15);
      imagechar ($this->checkimage, rand(5,8), $x+5, $y, $this->checkcode[$i], $bg_color);
    }
  }

imagechar:水平地画一个字符

统一调用

(如未显示全,可右滑)
private function outFileHeader()
  {
    header ("Content-type: image/png");
  }
 function create()
  {
//输出头
    $this->outFileHeader();
//产生验证码
    $this->createCode();
//产生图片
    $this->createImage();
//设置干扰像素
    $this->setDisturbColor();
//往图片上写验证码
    $this->writeCheckCodeToImage();
    imagepng($this->checkimage);
    imagedestroy($this->checkimage);
    $_SESSION[$this->session_flag]=$this->checkcode;
  }

imagpng:将PNG图像输出到浏览器或文件

在实际的开发过程中,我们往往会根据不同的需求作出不一样的验证码,这时候我们会设置一个函数,来接受不一样的参数,来完成特定的需求。

接受参数

(如未显示全,可右滑)
function config($width='80',$height='20',$codenum='4',$session_flag='captcha_code')
  {
    $this->width=$width;
    $this->height=$height;
    $this->codenum=$codenum;
    $this->session_flag=$session_flag;
  }

类与方法的调用

(如未显示全,可右滑)
<?php
include "captcha.php";
    $image=new Captcha();
$image->config('80','20','4','');
$image->create();//这样就会向浏览器输出一张图片

效果展示

在这里,小编对代码进行了部分注释,希望对大家的学习有所帮助,也希望有问题加我微信(wzc88czw)交流学习心得。

原文发布于微信公众号 - 程序员的碎碎念(gh_53e607dd4782)

原文发表时间:2018-02-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux驱动

裸机LCD驱动配置

本节来学习裸机下的LCD 驱动,本节学完后,再来学习Linux下如何使用LCD驱动 Linux中的LCD驱动,链接如下: (Linux-LCD层次分析链接:ht...

1748
来自专栏河湾欢儿的专栏

精灵图

为什么要有精灵图? 最早的时候网速十分有限,为了提升用户体验,我们会将一张大图分解成多张小图来提高页面打开速度,但是网速得到了提升,为了能够让服务器承载更多的...

621
来自专栏逍遥剑客的游戏开发

Direct3D学习(七):DirectX下天空盒子的实现

1174
来自专栏腾讯AlloyTeam的专栏

教你用 webgl 快速创建一个小世界

Webgl的魅力在于可以创造一个自己的3D世界,但相比较canvas2D来说,除了物体的移动旋转变换完全依赖矩阵增加了复杂度,就连生成一个物体都变得很复杂……这...

1.5K0
来自专栏开源项目

Git 项目推荐 | 图片验证码生成库

一个简单的Go语言实现的验证码。 图片实例 ? ? ? ? 简介 基于Golang实现的图片验证码生成库,可以实现随机字母个数,随机直线,随机噪点等。可以设置...

3456
来自专栏java工会

Java能写外挂吗?那就写个跳一跳辅助程序吧

##起初是想使用按键精灵脚本程序控制,但还是选择熟悉的java。我这里使用了工具,造成延迟问题。也求教:java控制安卓的正确姿势,

2070
来自专栏MixLab科技+设计实验室

生成专属于你的人工智能书【3D生成器】

a-frame 是基于 threejs 的 web AR 库,也可以当 threejs 的简化版本使用,a-frame 只需写 html 标签就可以实现3维空间...

1336
来自专栏coding for love

CSS进阶06-相对定位Relative Positioning

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

562
来自专栏青玉伏案

窥探Swift编程之在Playground上尽情的玩耍

  自从苹果公司发布Swift的时候,Xcode上又多了一样新的东西---"Playground"。Playground就像操场一样,可以供我们在代码的世界里尽...

1948
来自专栏iOS开发攻城狮的集散地

iOS 性能监测之FPS

2053

扫码关注云+社区