php 验证码 扭曲,php生成扭曲变形的验证码

原理:通过数学函数对图像的点重新分布,得到扭曲效果。首先生成一副正常的图片,然后遍历每个点,取得其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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值