看完就会,不会你打我,话不多说、开搞(人狠话不多)

1.0  首先先看代码

 <?php
 header("Content-Type:text/html;Charset=UTF-8");// 设置页面的编码风格
 header("Content-Type:image/jpeg");// 通知浏览器输出的是jpeg格式的图像

 $img = imagecreatetruecolor(150,50);//创建画布并设置大小  x轴150  y轴50

 $bgcolor = imagecolorallocate($img, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));//分配背景颜色
 imagefill($img, 0, 0, $bgcolor); ////把背景填充到图像
 imagejpeg($img);             // 输出图像
 imagedestroy($img);          // 销毁图像
 ?>

好,现在结合以上代码,来分析分析以上用到的几个函数:

①  imagecreatetruecolor(); 

imagecreatetruecolor — 新建一个真彩色图像(感觉哇,那么长,其实仔细一看挺好记的 image/create/true/color,什么是真彩色图像?往下看)

 resource imagecreatetruecolor ( int $width , int $height )

imagecreatetruecolor() 和 imagecreate()两个函数都能创建画布

 resource imagecreate ( int $x_size , int $y_size )

imagecreatetruecolor()建立的是一幅大小为 x和 y的黑色图像(默认为黑色[即便叫法就是真彩色图像]),如想改变背景颜色则需要用填充颜色函数 imagefill($img,0,0,$color);

imagecreate 新建一个空白图像资源,用imagecolorAllocate()添加背景色

上面两个函数只不过是一个功能的两种方法

②  imagecolorallocate();

imagecolorallocate — 为一幅图像分配颜色

 int imagecolorallocate ( resource $image , int $red , int $green , int $blue )

颜色分别用 红 绿 蓝三色组合,这些参数是 0 到 255 的整数或者十六进制的 0x00 到 0xFF。

③  mt_rand();

mt_rand — 生成更好的随机数

 int mt_rand ( int $min , int $max )

$min 可选的、返回的最小值(默认:0)  $max 可选的、返回的最大值(默认:mt_getrandmax())

这里就是用来让他随机生成背景颜色,0-255随便取值。所以页面没刷新一次画布背景颜色就不一样。
效果图:

2.0  开始往里面做干扰线,干扰点。防止验证图像被秒识别

 <?php
 header("Content-Type:text/html;Charset=UTF-8");// 设置页面的编码风格
 header("Content-Type:image/jpeg");// 通知浏览器输出的是jpeg格式的图像

 $img = imagecreatetruecolor(150,50);//创建画布并设置大小  x轴150  y轴50

 $bgcolor = imagecolorallocate($img, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));//分配背景颜色

 //添加干扰线,并循环3次,背景颜色随机
 for($i=0;$i<3;$i++){

     $linecolor = imagecolorallocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
     imageline($img, mt_rand(0,150), mt_rand(0,50), mt_rand(0,150), mt_rand(0,50), $linecolor);

 }
 //添加干扰点,并循环25次,背景颜色随机
 for($i=0;$i<25;$i++){

     $dotcolor = imagecolorallocate($img, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
     imagesetpixel($img, mt_rand(0,150), mt_rand(0,60), $dotcolor);

 }

 imagefill($img, 0, 0, $bgcolor); ////把背景填充到图像
 imagejpeg($img);             // 输出图像
 imagedestroy($img);          // 销毁图像
 ?>

函数分析:

①  imageline();

imageline — 画一条线段

 bool imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )

imageline() 用 color 颜色在图像 image 中从坐标 x1,y1 到 x2,y2(图像左上角为 0, 0)画一条线段。

imageline($img, mt_rand(0,150), mt_rand(0,50), mt_rand(0,150), mt_rand(0,50), $linecolor);这里意思就是 画布$img 中从坐标 x1,y1 到 x2,y2随机

②  imagesetpixel();

imagesetpixel— 画一个单一像素

 bool imagesetpixel ( resource $image , int $x , int $y , int $color )

imagesetpixel() 在 image 图像中用 color 颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。

imagesetpixel($img, mt_rand(0,150), mt_rand(0,60), $dotcolor);具体含义同上

效果图:

3.0  添加验证字母数字

 <?php
 header("Content-Type:text/html;Charset=UTF-8");// 设置页面的编码风格
 header("Content-Type:image/jpeg");// 通知浏览器输出的是jpeg格式的图像

 $img = imagecreatetruecolor(150,50);//创建画布并设置大小  x轴150  y轴50

 $bgcolor = imagecolorallocate($img, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));//分配背景颜色

 //添加干扰线,并循环3次,背景颜色随机
 for($i=0;$i<3;$i++){

     $linecolor = imagecolorallocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
     imageline($img, mt_rand(0,150), mt_rand(0,50), mt_rand(0,150), mt_rand(0,50), $linecolor);

 }
 //添加干扰点,并循环25次,背景颜色随机
 for($i=0;$i<25;$i++){

     $dotcolor = imagecolorallocate($img, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
     imagesetpixel($img, mt_rand(0,150), mt_rand(0,60), $dotcolor);

 }

 //添加需要验证的字母或者数字
 $rand_str = "qwertyuiopasdfghjklzxcvbnm1234567890";//需要使用到验证的一些字母和数字
 $str_arr = array();    //命名一个数组
 for($i = 0;$i<4;$i++){    //循环4次,就是有四个随机的字母或者数字
     $pos = mt_rand(0,strlen($rand_str)-1);
     $str_arr[] = $rand_str[$pos];//临时交换
 }

 $x_start=150/4;//单个字符X轴位置

 foreach ($str_arr as $key) {
     $fontcolor = imagecolorallocate($img, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
     imagettftext($img, 25, mt_rand(-15,15), $x_start, 50/2, $fontcolor, "C:/Windows/Fonts/Verdana.TTF", $key);
     $x_start +=20;//遍历后单个字符沿X轴 +20
 }

 imagefill($img, 0, 0, $bgcolor); ////把背景填充到图像
 imagejpeg($img);             // 输出图像
 imagedestroy($img);          // 销毁图像
 ?>

函数:

imagettftext();

imagettftext — 用 TrueType 字体向图像写入文本

 array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )

分析下面的代码:

imagettftext($img, 25, mt_rand(-15,15), $x_start, 50/2, $fontcolor, "C:/Windows/Fonts/Verdana.TTF", $key);

$img-----------画布

25-----------字体的尺寸。

mt_rand(-15,15)----------角度制表示的角度,0 度为从左向右读的文本。更高数值表示逆时针旋转。例如 90 度表示从下向上读的文本。(就是字体角度的问题,)

$x_start----------通俗易懂的讲就是字符的X轴位置

50/2----------字符的高度

$fontcolor----------字符颜色

"C:/Windows/Fonts/Verdana.TTF"----------字符的字体样式路径

$key-----------遍历出后的字符

效果:

看起来还是挺可爱的。

PHP生成制作验证码的更多相关文章

  1. Jsp制作验证码

    验证码 验证码(CAPTCHA)是"Completely Automated Public Turing test to tell Computers and Humans Apart&qu ...

  2. Java生成随机验证码

    package com.tg.snail.core.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  3. PHP利用jquery生成各种验证码和Ajax验证

    PHP生成验证码图片 PHP生成验证码的原理:使用PHP的GD库,生成一张带验证码的图片,并将验证码保存在Session中.PHP 生成验证码的大致流程有: .产生一张png的图片: .为图片设置背景 ...

  4. php生成动态验证码

    <?php/*调用示例*/session_start();$checkCode='';$chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPRSTUVWXYZ ...

  5. C#生成图形验证码

    先看效果: 再上代码 public class CaptchaHelper { private static Random rand = new Random(); private static in ...

  6. iOS 生成本地验证码

    在应用程序注册.登陆或者有关支付确认的界面,经常会用到验证码,验证码有的是通过手机发送获取的,有的是在本地点击获取的,通过手机发送获取的动态验证码可以使用第三方类库实现,本地点击获取的是在本地自己绘制 ...

  7. PHP5 GD库生成图形验证码(汉字)

    PHP5 GD库生成图形验证码且带有汉字的实例分享. 1,利用GD库函数生成图片,并在图片上写指定字符imagecreatetruecolor 新建一个真彩色图像imagecolorallocate ...

  8. (一)学习MVC之制作验证码

    制作验证码的方法在@洞庭夕照 看到的,原文链接:http://www.cnblogs.com/mzwhj/archive/2012/10/22/2720089.html 现自己利用该方法制作一个简单的 ...

  9. PHP5生成图形验证码(有汉字)

    利用PHP5中GD库生成图形验证码 类似于下面这样 1.利用GD库函数生成图片,并在图片上写指定字符 imagecreatetruecolor   新建一个真彩色图像      imagecolora ...

随机推荐

  1. 字符串匹配之KMP算法

    KMP算法使用前缀函数来模拟有限自动机的后缀函数,前缀函数通过计算模式与其自身的偏移匹配的信息,本身的证明很复杂,关键在于弄懂其核心思想,下面就不赘述了,仅仅贴出代码: #include <io ...

  2. Error In Work

    ReferenceError: BAD_REQUEST is not defined MyBatis配置错误,比如$!conflict.id,写成conflict.$!id

  3. Ubuntu 12.04 wine QQ

    1.首先安装最新版的wine1.52,没记错版本号应该是这个 sudo add-apt-repository ppa:ubuntu-wine/ppa sudo apt-get update sudo  ...

  4. MySQL check the manual that corresponds to your MySQL server version for the right syntax错误

    地化GO的时候一直遇到一个错误就是check the manual that corresponds to your MySQL server version for the right syntax ...

  5. Delphi 根据快捷方式路径取源文件地址

    unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...

  6. C# dynamic关键字的使用方法

    dynamic和var的区别:1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型.2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字段, ...

  7. C#异常之(已有打开的与此 Command 相关联,已有打开的与此命令相关联的 DataReader,必须首先将它关闭。)

    异常提示:“System.InvalidOperationException”类型的异常在 System.Data.dll 中发生,但未在用户代码中进行处理  其他信息: 已有打开的与此 Comman ...

  8. 关于调用系统照相机Activity被销毁问题解决

    <activity                  android:name=".visitplan_finish"                  android:co ...

  9. git设计哲学

    刚开始使用git的时候,总想拿git来和cvs或者svn来作对比,但不久后发现这个想法本身就是错的,git完全就是另外一种物种,一种本属于未来的物种.它的对象存储方式,快照,分支等,都是完全不同的. ...

  10. C#扫盲之:静态成员、静态方法、静态类、实例成员及区别

    文章目录 1.静态成员.实例成员 2.静态类 3.类的静态成员和非静态成员区别 --------------------------------------分割线------------------- ...