php验证码函数 使用imagestring() imagefttext()设置字体大小

本文介绍了两种生成验证码图片的方法,一种使用imagestring函数,另一种则利用imagefttext函数结合FreeType2字体库进行实现。文章详细解释了各步骤及关键参数的作用,包括颜色、字体大小、干扰线和点的绘制等,旨在提高验证码的安全性和识别难度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载路径:http://hi.baidu.com/asdasd_cn/item/62977d1e26ca36e85e53b142


生成验证码图片的两个函数

第一个是用imagestring

  bool imagestring    ( resource $image   , int $font   , int $x   , int $y   , string $s   , int $col   )

  imagestring()col   颜色将字符串 s 画到 image   所代表的图像的 xy   坐标处(这是字符串左上角坐标,整幅图像的左上角为 0,0)。如果   font 是 1,2,3,4 或 5,则使用内置字体。  

public function captcha1() {
    
        //生成验证码图片
        Header("Content-type: image/PNG");
        $rand ="";
        for($i=0;$i<4;$i++){
        $rand.=dechex(rand(0,15));
        }
        
        $im = imagecreate(100,50); //制定图片背景大小
        
        $black = ImageColorAllocate($im, 0,0,0); //设定三种颜色
        $white = ImageColorAllocate($im, 255,255,255);
        $gray = ImageColorAllocate($im, 200,200,200);
        for($i=0;$i<3;$i++){
            $te=imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));
        }
        imagefill($im,0,0,$gray); //采用区域填充法,设定(0,0)
        
    
        
        while(($rand=rand()%100000)<10000);
        //将四位整数验证码绘入图片
        $_SESSION['rand']=$rand;
        imagestring($im, 5, 30, 20, $rand, $te);
        // 用 col 颜色将字符串 s 画到 image 所代表的图像的 x,y 座标处(图像的左上角为 0, 0)。
        //如果 font 是 1,2,3,4 或 5,则使用内置字体
        
        for($i=0;$i<200;$i++) //加入干扰象素
        {
            $randcolor = ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255));
            imagesetpixel($im, rand()%100 , rand()%50 , $randcolor);
        }
        imageline($im,0,rand(0,100),100,rand(0,15),$randcolor);
        imageline($im,0,rand(0,100),100,rand(0,15),$randcolor);
        imageline($im,0,rand(0,100),100,rand(0,15),$randcolor);
        ImagePNG($im);
        ImageDestroy($im);

    }

第二个函数可根据根据字体库设置大小Linux端的注意路径

imagefttext — 使用 FreeType 2 字体将文本写入图像

  array imagefttext    ( resource $image   , float $size   , float $angle   , int $x   , int $y   , int $color   , string $fontfile   , string $text   [, array $extrainfo  ] )

//可以修改字体大小的验证码
    function captcha2($num=4,$size=20, $width=0,$height=0){   
        !$width && $width = $num*$size*4/5+5;   
        !$height && $height = $size + 10;   
        // 去掉了 0 1 O l 等   
        $str = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVW";   
        $code = '';   
        for ($i=0; $i<$num; $i++){   
                $code.= $str[mt_rand(0, strlen($str)-1)];   
        }   
        // 画图像   
        $im = imagecreatetruecolor($width,$height);   
        // 定义要用到的颜色   
        $back_color = imagecolorallocate($im, 235, 236, 237);   
        $boer_color = imagecolorallocate($im, 118, 151, 199);   
        $text_color = imagecolorallocate($im, mt_rand(0,200), mt_rand(0,120), mt_rand(0,120));   
           
        // 画背景   
        imagefilledrectangle($im,0,0,$width,$height,$back_color);   
        // 画边框   
        imagerectangle($im,0,0,$width-1,$height-1,$boer_color);   
        // 画干扰线   
        for($i=0;$i<5;$i++){   
            $font_color = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));   
            imagearc($im,mt_rand(-$width,$width),mt_rand(-$height,$height),mt_rand(30,$width*2),mt_rand(20,$height*2),mt_rand(0,360),mt_rand(0,360),$font_color);   
        }   
        // 画干扰点   
        for($i=0;$i<50;$i++){   
                $font_color = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));   
                imagesetpixel($im,mt_rand(0,$width),mt_rand(0,$height),$font_color);   
        }   
        // 画验证码   
        @imagefttext($im, $size , 0, 5, $size+3, $text_color, 'c://WINDOWS//Fonts//simsun.ttc',$code);   
        header("Cache-Control: max-age=1, s-maxage=1, no-cache, must-revalidate");   
        header("Content-type: image/png");   
        imagepng($im);
        imagedestroy($im);
    }
附:

Linux-debian 字体默认路径:/usr/share/fonts/truetype/ttf-dejavu/

考虑到程序的可移植性,在程序目录中新建字体目录fonts来使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值