1. 程式人生 > >php 生成圖片驗證碼方法

php 生成圖片驗證碼方法

昨天碰到一個需要自己寫圖片驗證碼的需要,我用的 Lumen 框架中沒有這個功能,需要自己寫,網上搜了下,記錄成一篇筆記.

程式碼

<?php
    /**
     * Created by PhpStorm.
     * User: nwei
     * Date: 2018/10/8
     * Time: 15:14
     *
     *    .--,       .--,
     *   ( (  \.---./  ) )
     *    '.__/o   o\__.'
     *       {=  ^  =}
     *        >  -  <
     *       /       \
     *      //       \\
     *     //|   .   |\\
     *     "'\       /'"_.-~^`'-.
     *        \  _  /--'         `
     *      ___)( )(___
     *     (((__) (__)))    高山仰止,景行行止.雖不能至,心嚮往之.
     *
     */


    namespace App\Tools;


    class VerifyCodeImage {
        private $width;
        private $height;
        private $str;
        private $im;
        private $strColor;

        function __construct($width, $height,$image_code) {
            $this->width  = $width;
            $this->height = $height;
            $this->str    = $image_code;
            $this->createImage();
        }

        /**
         * 生成圖片二維碼
         */
        function createImage() {
            $this->im = imagecreate($this->width, $this->height);//建立畫布
            imagecolorallocate($this->im, 200, 200, 200);//為畫布新增顏色
            for ($i = 0; $i < strlen($this->str); $i++) {//迴圈輸出四個數字
                $this->strColor = imagecolorallocate($this->im, rand(0, 100), rand(0, 100), rand(0, 100));
                imagestring($this->im, rand(3, 5), $this->width / 4 * $i + rand(5, 10), rand(2, 5), $this->str[$i], $this->strColor);
            }
            for ($i = 0; $i < 100; $i++) {//迴圈輸出200個畫素點
                $this->strColor = imagecolorallocate($this->im, rand(0, 255), rand(0, 255), rand(0, 255));
                imagesetpixel($this->im, rand(0, $this->width), rand(0, $this->height), $this->strColor);
            }
        }


        /**
         * 生成圖片二維碼並儲存
         * @return string
         */
        function show($openid) {
            try{
                removeDir("./imgcode");

                $path = "./imgcode/".date("Y-m-d",time())."/".$openid."/";
                if (!is_dir($path)){ //判斷目錄是否存在 不存在就建立
                    mkdir($path,0777,true);
                }

                $filename = $path.time().'.png'; //設定檔名
                header('content-type:image/png');//定義輸出為影象型別
                imagepng($this->im,$filename);//生成影象
                imagedestroy($this->im);//銷燬影象釋放記憶體

                return $filename;

            }catch (\Exception $exception){
                   operate_log("0","生成圖片二維碼失敗",$exception);
                   return false;
            }

        }
    }

使用如下: 

    use App\Tools\VerifyCodeImage;
$router->get('/', function () use ($router) {

    $imageCode = new VerifyCodeImage(80,20,'5698');
    $file_path = $imageCode->show('123456789');

    return [
        "file_path" => env("CSV_HOST").ltrim($file_path,"./")
    ];

});

 

 如果是直接輸出圖片,可以把 show() 方法改成

function show() {
            header('content-type:image/png');//定義輸出為影象型別
            imagepng($this->im);//生成影象
            imagedestroy($this->im);//銷燬影象釋放記憶體
 }