読んだらわかります、殴らないでください、あまり話さないで、話し始めてください(人はあまり話さない) )
1.0 まずはコードを見てみましょう
リーリー
それでは、上記のコードを組み合わせて、上で使用したいくつかの関数を分析します:
① imagecreatetruecolor();
imagecreatetruecolor — 新しいトゥルー カラー イメージを作成します (すごい長いと感じます。実際、よく見ると image/create/true/color を思い出すのは簡単です。トゥルー カラー イメージとは何ですか?続きを読む) リーリー
imagecreatetruecolor() と imagecreate() どちらの関数もキャンバスを作成できます リーリー
imagecreatetruecolor()は、サイズxとyの黒い画像を作成します(デフォルトは黒です[トゥルーカラー画像と呼ばれても])、背景を変更したい場合は、 color の場合は、塗りつぶしカラー関数 imagefill($img,0,0,$color);を使用する必要があります。
imagecreate 新しい空の画像リソースを作成し、imagecolorAllocate() を使用して背景色を追加します
上記の 2 つの関数は、同じ関数の 2 つのメソッドにすぎません
② imagecolorallocate();
imagecolorallocate — 画像に色を割り当てます リーリー
色はそれぞれ赤、緑、青で構成されます。これらのパラメータは 0 ~ 255 の整数または 16 進数の 0x00 ~ 0xFF です。
③ mt_rand();
mt_rand — より良い乱数を生成 リーリー
オプション、返される最大値 (デフォルト:mt_getrandmax()) $min
可选的、返回的最小值(默认:0) $max
2.0 内部に干渉線と干渉点を作り始めます。検証画像が数秒で認識されないようにする リーリー
①
imageline();
線分を描く リーリー
imageline() は
を使用して線分を描画します (画像の左上隅が 0, 0)。 imagesetpixel— 画一个单一像素 imagesetpixel() 在 效果图:
3.0 添加验证字母数字 函数: imagettftext(); imagettftext — 用 TrueType 字体向图像写入文本 分析下面的代码: $img-----------画布 25-----------字体的尺寸。 mt_rand(-15,15)----------角度制表示的角度,0 度为从左向右读的文本。更高数值表示逆时针旋转。例如 90 度表示从下向上读的文本。(就是字体角度的问题,) $x_start----------通俗易懂的讲就是字符的X轴位置 50/2----------字符的高度 $fontcolor----------字符颜色 "C:/Windows/Fonts/Verdana.TTF"----------字符的字体样式路径 $key-----------遍历出后的字符 效果:
看起来还是挺可爱的。 color
颜色在图像 image
中从坐标 x1
,y1
到 x2
,y2
<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();<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>
image
图像中用 color
颜色在 x
,y
坐标(图像左上角为 0,0)上画一个点。 <span><em>imagesetpixel($img, mt_rand(0,150), mt_rand(0,60), $dotcolor);<br /></em>具体含义同上<br /><br /></span>
<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>
<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>