1. Application Scenarios
In WEB websites, image verification codes are often used to prevent malicious user registration, posting and other scenarios. In PHP, image verification code is mainly completed through the API provided by the GD library.
2. Implementation method
Verification codes are generally a combination of random numbers and letters, and can be easily implemented through random functions and hexadecimal functions dechex. The most critical issue is how to generate images.
<?php //生成随机数-》创建图片-》随机数写进图片 -》输出到浏览器 for($i=0;$i<4;$i++) { $rand .= dechex(rand(1,15)); } $im = imagecreatetruecolor(100,30);// 新建一个真彩色图像 x就是宽 ,y就是高 //设置颜色 // 为一幅图像分配颜色(相当于 PhotoShop 的调色板) // imagecolorallocate ( resource image, int red, int green, int blue ) 返回一个标识符,代表了由给定的 RGB 成分组成的颜色。 $bg = imagecolorallocate($im,0,0,0);//第一次对 imagecolorallocate() 的调用会给基于调色板的图像填充背景色。代表了由给定的 RGB 成分组成的颜色 $te = imagecolorallocate($im,225,225,225); //把字符串写在图像左上角 //绘图函数 imagestring ( resource image, font, int x, int y, string s, int col ) //用 col 颜色将字符串 s 画到 image 所代表的图像的 x,y 坐标处(这是字符串左上角坐标,整幅图像的左上角为 0,0)。如果 font 是 1,2,3,4 或 5,则使用内置字体。 imagestring($im,5,rand(3,70),rand(0,16),$rand,$te); //直接输出图像到浏览器 header("Content-type: image/jpeg"); // imagejpeg ( resource image [, string filename [, int quality]] ) filename 参数为可选,如果省略,则原始图像流将被直接输出。要省略 filename 参数而提供 quality 参数,使用空字符串('')。通过 header() 发送 Content-type: image/jpeg 可以使 PHP 脚本直接输出 JPEG 图像。 imagejpeg($im); ?>
3. Make complex image verification codes
Sometimes the verification code must set up some interference in order to prevent it from being recognized by some image recognition tools. For example, randomly add some lines or dots to the picture. This is mainly achieved through the imageline() and imagesetpixel() functions. Even make Chinese verification code.
<?php for($i=0;$i<4;$i++) { $rand .= dechex(rand(1,15)); } $im = imagecreatetruecolor(100,30); $bg = imagecolorallocate($im,0,0,0); $te = imagecolorallocate($im,225,225,225); //画线条 for($i=0; $i<3; $i++){ $te2 = imagecolorallocate($im,rand(0,225),rand(0,225),rand(0,225)); //imageline ( resource image, int x1, int y1, int x2, int y2, int color ) 用 color 颜色在图像 image 中从坐标 x1,y1 到 x2,y2(图像左上角为 0, 0)画一条线段。 imageline($im,rand(0,100),0,rand(0,100),rand(0,30),$te2); } //画点 for($i = 0; $i < 100; $i++){ //imagesetpixel ( resource image, int x, int y, int color ) 在 image 图像中用 color 颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。 imagesetpixel($im,rand()%100,rand()%30,$te2); } $str = iconv("gbk","UTF-8","验证码");//把gbk编码转换成UTF-8,如果文件的编码是 UTF-8,则不需要这一步。因为我们的系统(Windows)自带的字体默认是用国际通用编码(UTF-8)模式来识别的,所以如果不做编码转换,可能无法正常显示。 imagettftext($im,12,rand(0,10),20,20,$te,'msyh.ttf',$str);//rand(3,10)倾斜度。msyh.ttf 是微软雅黑字体,可在 C:\Windows\Fonts (Windows XP、Windows 7)找到。然后拷贝到该文件的目录。Windows 下之所以能够显示中文,是因为系统安装了中文字体 header("Content-type: image/jpeg"); imagejpeg($im); ?>