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 条评论
登录 后参与评论

相关文章

来自专栏开源项目

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

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

4026
来自专栏我分享我快乐

如何将flash制作的动画存成高质量的GIF

喜欢用flash制作GIF动画的同学有个疑惑就是flash直接导出的GIF质量不高无法达到我们对动画的色彩要求,所以下面教大家如何将flash制作的动画存成...

3287
来自专栏Grace development

PHP GD库解析一张简单图片并输出

1060
来自专栏企鹅号快讯

浅谈 Web 图像优化

前端优化有很多,图像优化也是其中的一部分。无论是渐进增强还是优雅降级,图像优化成为了开发上不可忽视的一部分。 知其然,须知其所以然 图像优化的前提是需要了解图像...

2129
来自专栏Golang语言社区

GO语言利用K近邻算法实现小说鉴黄

Usuage: go run kNN.go --file="data.txt" 关键是向量点的选择和阈值的判定 样本数据来自国家新闻出版总署发布通知公布的《...

2915
来自专栏Python数据科学

Python十分钟制作属于你自己的个性logo

词云的使用相信大家已经不陌生了,使用很简单,直接调用wordcloud包就可以了。它的主要功能是根据文本词汇和词汇频率生成图片,从中可以直观的看出各个词汇所占比...

822
来自专栏ios 技术积累

ios Charts MarkerView遇到的一个问题

两个问题 问题1:最大值的的时候 MarkerView 坐标有问题 ,原因就是最大值的时候,曲线已经在View的顶部了,所以MarkerView 的Y坐标还要...

2793
来自专栏深度学习自然语言处理

【python】Tkinter可视化窗口(一)

因为想给自己的毕设要做个可视化,而不是简单地黑框框,就试着学了学Tkinter,发现上手起来是真的简单,在此,推荐给大家!

1762
来自专栏V站

python实现生成验证码的逻辑

2048
来自专栏用户2442861的专栏

【Qt编程】基于QWT的曲线绘制及图例显示操作

http://blog.csdn.net/tengweitw/article/details/41911035

6051

扫码关注云+社区