PHP實現驗證碼

第一步:創建一個畫布

第二步:創建顏色

第三步:準備字符

第四步:往 畫布上寫字符

第五步:畫干擾線(點)

第六步:輸出格式

第七步:輸出圖片

第八步:銷燬資源

<?php 
    verify();
function verify($width = 100 , $height = 40 , $num = 5 , $type = 3 ){


    //1 創建畫布
    $image = imagecreatetruecolor($width , $height);
    
    //2 創建顏色  //因爲後邊總是用,所以寫了兩個函數,分別是lightColor(淺顏色)、deepColor(深顏色)
    
    
    //3 創建字符 //這裏是自己選擇的類型,1 就是純數字,2 就是純小字母, 3 就是數字大小寫字母的混合
    switch($type){
        case 1:
            //定義字符串
            $str = "0123456789";
            //打亂字符串
            $strNew = str_shuffle($str);
            //截取$num個
            $string = substr($strNew , 0 , $num);
            break;
        case 2:
            //定義字符
            $arr = range('a' , 'z');
            //打亂字符串數組
            shuffle($arr);
            //截取
            $tmp = array_slice($arr , 0 , $num);
            //連成字符串
            $string = join('' , $tmp);
            break;
        case 3:
            $str = "23456789abcdefghjklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";
            $string = substr(str_shuffle($str) , 0 , $num);
            break;
    }
    //給背景填充淺顏色 //背景顏色太深的話驗證碼就看不清了
    imagefilledrectangle($image , 0 , 0 , $width , $height , lightColor($image));
    
    //4 往畫布上寫入字符
    for($i = 0; $i<$num; $i++) {  //因爲我們設定的是輸出5 個字符,所以$i是小於的$num
        //floor是取整,$width / $num 把寬度分了$num塊地,*$i是一個字符佔一塊地,以免全都堆在一塊看不出來
        $x = floor($width / $num) * $i;
        $y = mt_rand(10 , $height - 20);
        imagechar ($image , 5 , $x , $y , $string[$i] , deepColor($image));
    }
    
    //5 畫干擾線、點
    //干擾線
    for($i = 0; $i<$num; $i++) {
        imagearc ($image , mt_rand(10 , $width) , mt_rand(10 , $height) , mt_rand(10 , $width) , mt_rand(10 , $height) , mt_rand(0 , 10) , mt_rand(0 , 270) , deepColor($image));
        
    }
    //干擾點
    for( $i = 0; $i<50; $i++) {
        imagesetpixel($image , mt_rand(0 , $width) , mt_rand(0 , $height) , deepColor($image));
    }
    ob_clean();//擦除緩衝區  
    //6 告訴瀏覽器輸出格式:png
    header("Content-type: image/png");
    
    //7 輸出圖片
    imagepng($image);
    
    //8 銷燬
    imagedestroy($image);
    
    return $string;
    //echo $string;
}


//設置深淺顏色
function lightColor ($image) {
    return imagecolorallocate($image , mt_rand(120 , 255) , mt_rand(120 , 255) , mt_rand(120 , 255)); 
}

function deepColor ($image) {
    return imagecolorallocate($image , mt_rand(0 , 120) , mt_rand(0 , 120) , mt_rand(0 , 120)); 
}    
?>


特別說明:

 ob_clean();//擦除緩衝區

之前是沒有加上這個的,結果就告訴我“因存在錯誤而無法顯示”,如下圖:

圖片.png


不過幸運的是,在百度上找到答案了:https://blog.csdn.net/ghbfgb/article/details/50845075。加上之後,就很輕易的解決了這個問題,現在的效果是這樣的:


圖片.png


好了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章