1. 적용 시나리오
WEB 웹사이트에서는 악의적인 사용자 등록, 게시 및 기타 시나리오를 방지하기 위해 이미지 인증 코드가 사용되는 경우가 많습니다. PHP에서는 주로 GD 라이브러리에서 제공하는 API를 통해 이미지 검증코드가 완성됩니다.
2. 구현 방법
인증코드는 일반적으로 난수와 문자의 조합으로 랜덤함수와 16진수 함수 디첵을 통해 쉽게 구현할 수 있습니다. 가장 중요한 질문은 이미지를 생성하는 방법입니다.
<?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. 복잡한 이미지 인증코드 만들기
인증코드는 일부 이미지 인식 도구에서 인식되지 않도록 간섭을 설정해야 하는 경우도 있습니다. 예를 들어 그림에 선이나 점을 무작위로 추가합니다. 이는 주로 imageline() 및 imagesetpixel() 함수를 통해 달성됩니다. 중국어 인증코드도 만들어 보세요.
<?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); ?>