Heim > Artikel > Backend-Entwicklung > PHP生成制作验证码,php生成验证码_PHP教程
看完就会,不会你打我,话不多说、开搞(人狠话不多)
1.0 首先先看代码
<span><span> 1</span> <?<span>php </span><span> 2</span> <span>header</span>("Content-Type:text/html;Charset=UTF-8");<span>//</span><span> 设置页面的编码风格</span> <span> 3</span> <span>header</span>("Content-Type:image/jpeg");<span>//</span><span> 通知浏览器输出的是jpeg格式的图像</span> <span> 4</span> <span> 5</span> <span>$img</span> = imagecreatetruecolor(150,50);<span>//</span><span>创建画布并设置大小 x轴150 y轴50</span> <span> 6</span> <span> 7</span> <span>$bgcolor</span> = imagecolorallocate(<span>$img</span>, <span>mt_rand</span>(0,255), <span>mt_rand</span>(0,255), <span>mt_rand</span>(0,255));<span>//</span><span>分配背景颜色</span> <span> 8</span> imagefill(<span>$img</span>, 0, 0, <span>$bgcolor</span>); <span>//</span><span>//把背景填充到图像</span> <span> 9</span> imagejpeg(<span>$img</span>); <span>//</span><span> 输出图像</span> <span>10</span> imagedestroy(<span>$img</span>); <span>//</span><span> 销毁图像</span> <span>11</span> ?></span>
好,现在结合以上代码,来分析分析以上用到的几个函数:
① imagecreatetruecolor();
imagecreatetruecolor — 新建一个真彩色图像(感觉哇,那么长,其实仔细一看挺好记的 image/create/true/color,什么是真彩色图像?往下看)
<span><span>1</span> <span>resource</span> imagecreatetruecolor ( int <span>$width</span> , int <span>$height</span> )</span>
imagecreatetruecolor() 和 imagecreate()两个函数都能创建画布
<span><span>1</span> <span>resource</span> imagecreate ( int <span>$x_size</span> , int <span>$y_size</span> )</span>
imagecreatetruecolor()建立的是一幅大小为 x和 y的黑色图像(默认为黑色[即便叫法就是真彩色图像]),如想改变背景颜色则需要用填充颜色函数 imagefill($img,0,0,$color);
imagecreate 新建一个空白图像资源,用imagecolorAllocate()添加背景色
上面两个函数只不过是一个功能的两种方法
② imagecolorallocate();
imagecolorallocate — 为一幅图像分配颜色
<span><span>1</span> int imagecolorallocate ( <span>resource</span> <span>$image</span> , int <span>$red</span> , int <span>$green</span> , int <span>$blue</span> )</span>
颜色分别用 红 绿 蓝三色组合,这些参数是 0 到 255 的整数或者十六进制的 0x00 到 0xFF。
③ mt_rand();
mt_rand — 生成更好的随机数
<span><span>1</span> int <span>mt_rand</span> ( int <span>$min</span> , int <span>$max</span> )</span>
$min
可选的、返回的最小值(默认:0) $max
可选的、返回的最大值(默认:mt_getrandmax())
2.0 开始往里面做干扰线,干扰点。防止验证图像被秒识别
<span><span> 1</span> <?<span>php </span><span> 2</span> <span>header</span>("Content-Type:text/html;Charset=UTF-8");<span>//</span><span> 设置页面的编码风格</span> <span> 3</span> <span>header</span>("Content-Type:image/jpeg");<span>//</span><span> 通知浏览器输出的是jpeg格式的图像</span> <span> 4</span> <span> 5</span> <span>$img</span> = imagecreatetruecolor(150,50);<span>//</span><span>创建画布并设置大小 x轴150 y轴50</span> <span> 6</span> <span> 7</span> <span>$bgcolor</span> = imagecolorallocate(<span>$img</span>, <span>mt_rand</span>(0,255), <span>mt_rand</span>(0,255), <span>mt_rand</span>(0,255));<span>//</span><span>分配背景颜色 </span><span> 8</span> <span> 9</span> <span>//添加干扰线,并循环3次,背景颜色随机</span> <span>10</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><3;<span>$i</span>++<span>){ </span><span>11</span> <span>12</span> <span>$linecolor</span> = imagecolorallocate(<span>$img</span>,<span>mt_rand</span>(0,255),<span>mt_rand</span>(0,255),<span>mt_rand</span>(0,255<span>)); </span><span>13</span> imageline(<span>$img</span>, <span>mt_rand</span>(0,150), <span>mt_rand</span>(0,50), <span>mt_rand</span>(0,150), <span>mt_rand</span>(0,50), <span>$linecolor</span><span>); </span><span>14</span> <span>15</span> <span>} </span><span>16</span> <span>//</span><span>添加干扰点,并循环25次,背景颜色随机</span> <span>17</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><25;<span>$i</span>++<span>){ </span><span>18</span> <span>19</span> <span>$dotcolor</span> = imagecolorallocate(<span>$img</span>, <span>mt_rand</span>(0,255), <span>mt_rand</span>(0,255), <span>mt_rand</span>(0,255<span>)); </span><span>20</span> imagesetpixel(<span>$img</span>, <span>mt_rand</span>(0,150), <span>mt_rand</span>(0,60), <span>$dotcolor</span><span>); </span><span>21</span> <span>22</span> <span>} </span><span>23</span> <span>24</span> imagefill(<span>$img</span>, 0, 0, <span>$bgcolor</span>); <span>//</span><span>//把背景填充到图像</span> <span>25</span> imagejpeg(<span>$img</span>); <span>//</span><span> 输出图像</span> <span>26</span> imagedestroy(<span>$img</span>); <span>//</span><span> 销毁图像</span> <span>27</span> ?></span>
函数分析:
① imageline();
imageline — 画一条线段
<span><span>1</span> bool imageline ( <span>resource</span> <span>$image</span> , int <span>$x1</span> , int <span>$y1</span> , int <span>$x2</span> , int <span>$y2</span> , int <span>$color</span> )</span>
imageline() 用 color
颜色在图像 image
中从坐标 x1
,y1
到 x2
,y2
(图像左上角为 0, 0)画一条线段。
<span><em>imageline($img, mt_rand(0,150), mt_rand(0,50), mt_rand(0,150), mt_rand(0,50), $linecolor);<br /></em><br />这里意思就是 画布$img 中从坐标 <code class="parameter">x1</code>,<code class="parameter">y1</code> 到 <code class="parameter">x2</code>,<code class="parameter">y2</code>随机<br /></span>
② imagesetpixel();
imagesetpixel— 画一个单一像素
<span><span>1</span> bool imagesetpixel ( <span>resource</span> <span>$image</span> , int <span>$x</span> , int <span>$y</span> , int <span>$color</span> )</span>
imagesetpixel() 在 image
图像中用 color
颜色在 x
,y
坐标(图像左上角为 0,0)上画一个点。
<span><em>imagesetpixel($img, mt_rand(0,150), mt_rand(0,60), $dotcolor);<br /></em>具体含义同上<br /><br /></span>
效果图:
3.0 添加验证字母数字
<span><span> 1</span> <?<span>php </span><span> 2</span> <span>header</span>("Content-Type:text/html;Charset=UTF-8");<span>//</span><span> 设置页面的编码风格</span> <span> 3</span> <span>header</span>("Content-Type:image/jpeg");<span>//</span><span> 通知浏览器输出的是jpeg格式的图像</span> <span> 4</span> <span> 5</span> <span>$img</span> = imagecreatetruecolor(150,50);<span>//</span><span>创建画布并设置大小 x轴150 y轴50</span> <span> 6</span> <span> 7</span> <span>$bgcolor</span> = imagecolorallocate(<span>$img</span>, <span>mt_rand</span>(0,255), <span>mt_rand</span>(0,255), <span>mt_rand</span>(0,255));<span>//</span><span>分配背景颜色 </span><span> 8</span> <span> 9</span> <span>//添加干扰线,并循环3次,背景颜色随机</span> <span>10</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><3;<span>$i</span>++<span>){ </span><span>11</span> <span>12</span> <span>$linecolor</span> = imagecolorallocate(<span>$img</span>,<span>mt_rand</span>(0,255),<span>mt_rand</span>(0,255),<span>mt_rand</span>(0,255<span>)); </span><span>13</span> imageline(<span>$img</span>, <span>mt_rand</span>(0,150), <span>mt_rand</span>(0,50), <span>mt_rand</span>(0,150), <span>mt_rand</span>(0,50), <span>$linecolor</span><span>); </span><span>14</span> <span>15</span> <span>} </span><span>16</span> <span>//</span><span>添加干扰点,并循环25次,背景颜色随机</span> <span>17</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><25;<span>$i</span>++<span>){ </span><span>18</span> <span>19</span> <span>$dotcolor</span> = imagecolorallocate(<span>$img</span>, <span>mt_rand</span>(0,255), <span>mt_rand</span>(0,255), <span>mt_rand</span>(0,255<span>)); </span><span>20</span> imagesetpixel(<span>$img</span>, <span>mt_rand</span>(0,150), <span>mt_rand</span>(0,60), <span>$dotcolor</span><span>); </span><span>21</span> <span>22</span> <span>} </span><span>23</span> <span>24</span> <span>//</span><span>添加需要验证的字母或者数字</span> <span>25</span> <span>$rand_str</span> = "qwertyuiopasdfghjklzxcvbnm1234567890";<span>//</span><span>需要使用到验证的一些字母和数字</span> <span>26</span> <span>$str_arr</span> = <span>array</span>(); <span>//</span><span>命名一个数组</span> <span>27</span> <span>for</span>(<span>$i</span> = 0;<span>$i</span><4;<span>$i</span>++){ <span>//</span><span>循环4次,就是有四个随机的字母或者数字 </span> <span>28</span> <span>$pos</span> = <span>mt_rand</span>(0,<span>strlen</span>(<span>$rand_str</span>)-1<span>); </span><span>29</span> <span>$str_arr</span>[] = <span>$rand_str</span>[<span>$pos</span>];<span>//</span><span>临时交换</span> <span>30</span> <span>} </span><span>31</span> <span>32</span> <span>$x_start</span>=150/4;<span>//</span><span>单个字符X轴位置</span> <span>33</span> <span>34</span> <span>foreach</span> (<span>$str_arr</span> <span>as</span> <span>$key</span><span>) { </span><span>35</span> <span>$fontcolor</span> = imagecolorallocate(<span>$img</span>, <span>mt_rand</span>(0,255), <span>mt_rand</span>(0,255), <span>mt_rand</span>(0,255<span>)); </span><span>36</span> imagettftext(<span>$img</span>, 25, <span>mt_rand</span>(-15,15), <span>$x_start</span>, 50/2, <span>$fontcolor</span>, "C:/Windows/Fonts/Verdana.TTF", <span>$key</span><span>); </span><span>37</span> <span>$x_start</span> +=20;<span>//</span><span>遍历后单个字符沿X轴 +20</span> <span>38</span> <span>} </span><span>39</span> <span>40</span> imagefill(<span>$img</span>, 0, 0, <span>$bgcolor</span>); <span>//</span><span>//把背景填充到图像</span> <span>41</span> imagejpeg(<span>$img</span>); <span>//</span><span> 输出图像</span> <span>42</span> imagedestroy(<span>$img</span>); <span>//</span><span> 销毁图像</span> <span>43</span> ?></span>
函数:
imagettftext();
imagettftext — 用 TrueType 字体向图像写入文本
<span><span>1</span> <span>array</span> imagettftext ( <span>resource</span> <span>$image</span> , <span>float</span> <span>$size</span> , <span>float</span> <span>$angle</span> , int <span>$x</span> , int <span>$y</span> , int <span>$color</span> , <span>string</span> <span>$fontfile</span> , <span>string</span> <span>$text</span> )</span>
分析下面的代码:
<span>imagettftext($img, 25, mt_rand(-15,15), $x_start, 50/2, $fontcolor, "C:/Windows/Fonts/Verdana.TTF", $key);</span>
$img-----------画布
25-----------字体的尺寸。
mt_rand(-15,15)----------角度制表示的角度,0 度为从左向右读的文本。更高数值表示逆时针旋转。例如 90 度表示从下向上读的文本。(就是字体角度的问题,)
$x_start----------通俗易懂的讲就是字符的X轴位置
50/2----------字符的高度
$fontcolor----------字符颜色
"C:/Windows/Fonts/Verdana.TTF"----------字符的字体样式路径
$key-----------遍历出后的字符
效果:
看起来还是挺可爱的。