原理:通过数学函数对图像的点重新分布,得到扭曲效果。首先生成一副正常的图片,然后遍历每个点,取得其rgb色和坐标,通过数学函数变换点的坐标值,然后在写入到新的图像中,这样即得到扭曲的图形。要得到更复杂的图形,可以把每个字符当做一副图片,使用不同的字体,变形后再写入新的图像,就可以得到像google那样扭扭曲曲的验证码了。
line18:中”ROOT.’/app/vendors/MSYHBD.TTF'”为字体文件路径,修改指向某个字体文件即可。
代码如下,在项目中可以使用,单独拿出来未测试:
function getAuthImage($text , $im_x = 160 , $im_y = 32) { $im = imagecreatetruecolor($im_x,$im_y); $text_c = ImageColorAllocate($im, mt_rand(0,100),mt_rand(0,100),mt_rand(0,100)); $tmpC0=mt_rand(100,255); $tmpC1=mt_rand(100,255); $tmpC2=mt_rand(100,255); $buttum_c = ImageColorAllocate($im,$tmpC0,$tmpC1,$tmpC2); imagefill($im, 16, 13, $buttum_c);
$font = ‘c:\\WINDOWS\\Fonts\\arial.ttf’;
for ($i=0;$i
$distortion_im = imagecreatetruecolor ($im_x, $im_y); imagefill($distortion_im, 16, 13, $buttum_c); for ( $i=0; $i=0 ) { imagesetpixel ($distortion_im, (int)($i+10+sin($j/$im_y*2*M_PI-M_PI*0.5)*6) , $j , $rgb); } } } //加入干扰象素; $count = 600;//干扰像素的数量 for($i=0; $i
$line_c=3; //imageline for($i=0; $i < $line_c; $i++) { $linecolor = imagecolorallocate($distortion_im, 17, 158, 20); $lefty = mt_rand(1, $im_x-1); $righty = mt_rand(1, $im_y-1); imageline($distortion, 0, $lefty, imagesx($distortion_im), $righty, $linecolor); }
//设置文件头; Header(“Content-type: image/PNG”);
//以PNG格式将图像输出到浏览器或文件; //ImagePNG($im); ImagePNG($distortion_im);
//销毁一图像,释放与image关联的内存; ImageDestroy($distortion_im); ImageDestroy($im);}
function make_rand($length=”32″){//验证码文字生成函数 $str=”abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890″; $result=””; for($i=0;$i
稍微修改下,支持中文。
<?phpfunction make_rand($length=”32″){//验证码文字生成函数 $str=”abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890″; $result=””; for($i=0;$i<$length;$i++){ $num[$i]=rand(0,61); $result.=$str[$num[$i]]; } return $result;}$checkcode = make_rand(5);$im_x=160;$im_y=32;function make_crand($length=”5″) { $string = ”; for($i=0;$i<$length;$i++) { $string .= chr(rand(0xB0,0xF7)).chr(rand(0xA1,0xFE)); } return $string;}getAuthImage(make_crand(5));function getAuthImage($text , $im_x = 230 , $im_y = 32) { $im = imagecreatetruecolor($im_x,$im_y); $text_c = ImageColorAllocate($im, mt_rand(0,100),mt_rand(0,100),mt_rand(0,100)); $tmpC0=mt_rand(100,255); $tmpC1=mt_rand(100,255); $tmpC2=mt_rand(100,255); $buttum_c = ImageColorAllocate($im,$tmpC0,$tmpC1,$tmpC2); imagefill($im, 16, 13, $buttum_c); //echo $text; $font = ‘c:\\WINDOWS\\Fonts\\simsun.ttc’; //echo strlen($text); $text=iconv(“gb2312″,”UTF-8”,$text); //echo mb_strlen($text,”UTF-8″); for ($i=0;$i=0 ) { imagesetpixel ($distortion_im, (int)($i+10+sin($j/$im_y*2*M_PI-M_PI*0.5)*3) , $j , $rgb); } } } //加入干扰象素; $count = 600;//干扰像素的数量 for($i=0; $i