亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP生成Gif圖片驗證碼

2024-05-04 23:19:03
字體:
來源:轉載
供稿:網友

先看效果圖

PHP生成Gif圖片驗證碼


 

PHP生成Gif圖片驗證碼


字體及字體文件的路徑需要在類中$FontFilePath及$FontFileName中設置。如:

復制代碼 代碼如下:


private static $FontFilePath = "static/font/"; //相對地本代碼文件的位置
private static $FontFileName = array("3.ttf");// array("1.ttf", "2.ttf", "3.ttf", "4.ttf", "5.ttf", "6.ttf", "7.ttf", "8.ttf"); //


完整代碼如下:

復制代碼 代碼如下:


<?PHP

/**
  說明: 驗證碼生成類,支持生成Gif圖片驗證碼(帶噪點,干擾線,網格,隨機色背景,隨機自定義字體,傾斜,Gif動畫)

  服務端:
  $mod = strtolower(isset($_REQUEST["mod"]) ? $_REQUEST["mod"] : "");
  if($mod == "code"){
  echo SecurityCode::Draw(4, 1, 120, 30, 5, 10, 100, "secode");
  die();
  }
  調用: <img src="/getcode.php?mod=code">
  驗證:
  $reqCode = strtolower(isset($_REQUEST["secode"]) ? $_REQUEST["secode"] : "");  //請求的驗證碼
  $sessionCode = strtolower(isset($_SESSION["secode"]) ? $_SESSION["secode"] : ""); //會話生成的驗證碼
  if($reqCode != $sessionCode){
  echo "安全驗證碼錯誤!";
  die();
  }
 */
$mod = strtolower(isset($_REQUEST["mod"]) ? $_REQUEST["mod"] : "");
if ($mod == "code") {
    echo SecurityCode::Draw(4, 15, 100, 27, 10, 2, 100, "secode");
    die();
}

//安全驗證碼類
class SecurityCode {

    private static $Debug = 0;
    private static $Code = '';
    private static $Chars = 'bcdefhkmnrstuvwxyABCDEFGHKMNPRSTUVWXY34568';
    //private static $Chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890';
    private static $TextGap = 20;
    private static $TextMargin = 5;
    private static $FontFilePath = "static/font/"; //相對地本代碼文件的位置
    private static $FontFileName =array("3.ttf");// array("1.ttf", "2.ttf", "3.ttf", "4.ttf", "5.ttf", "6.ttf", "7.ttf", "8.ttf"); //
    private static $Img = 'GIF89a'; //GIF header 6 bytes   
    private static $BUF = Array();
    private static $LOP = 0;
    private static $DIS = 2;
    private static $COL = -1;
    private static $IMG = -1;

    /**
      生成GIF圖片驗證
      @param int $L 驗證碼長度
      @param int $F 生成Gif圖的幀數
      @param int $W 寬度
      @param int $H 高度
      @param int $MixCnt 干擾線數
      @param int $lineGap 網格線間隔
      @param int $noisyCnt 澡點數
      @param int $sessionName 驗證碼Session名稱
     */
    public static function Draw($L = 4, $F = 1, $W = 150, $H = 30, $MixCnt = 2, $lineGap = 0, $noisyCnt = 10, $sessionName = "Code") {
        ob_start();
        ob_clean();

        for ($i = 0; $i < $L; $i++) {
            self::$Code .= SubStr(self::$Chars, mt_rand(0, strlen(self::$Chars) - 1), 1);
        }

        if (!isset($_SESSION))
            session_start();
        $_SESSION[$sessionName] = strtolower(self::$Code);

        $bgRGB = array(rand(0, 255), rand(0, 255), rand(0, 255));
        //生成一個多幀的GIF動畫
        for ($i = 0; $i < $F; $i++) {
            $img = ImageCreate($W, $H);

            //背景色
            $bgColor = imagecolorallocate($img, $bgRGB[0], $bgRGB[1], $bgRGB[2]);
            ImageColorTransparent($img, $bgColor);
            unset($bgColor);

            //添加噪點
            $maxNoisy = rand(0, $noisyCnt);
            $noisyColor = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255));
            for ($k = 0; $k <= $maxNoisy; $k++) {
                imagesetpixel($img, rand(0, $W), rand(0, $H), $noisyColor);
            }

            //添加網格
            if ($lineGap > 0) {
                for ($m = 0; $m < ($W / $lineGap); $m++) { //豎線
                    imageline($img, $m * $lineGap, 0, $m * $lineGap, $H, $noisyColor);
                }
                for ($n = 0; $n < ($H / $lineGap); $n++) { //橫線
                    imageline($img, 0, $n * $lineGap, $W, $n * $lineGap, $noisyColor);
                }
            }
            unset($noisyColor);

            // 添加干擾線
            for ($k = 0; $k < $MixCnt; $k++) {
                $wr = mt_rand(0, $W);
                $hr = mt_rand(0, $W);
                $lineColor = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255));
                imagearc($img, $W - floor($wr / 2), floor($hr / 2), $wr, $hr, rand(90, 180), rand(180, 270), $lineColor);
                unset($lineColor);
                unset($wr, $hr);
            }

            //第一幀忽略文字
            if ($i != 0 || $F <= 1) {
                //文字           
                $foreColor = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255));
                for ($j = 0; $j < $L; $j++) {
                    $fontFile = self::$FontFilePath . self::$FontFileName[rand(0, count(self::$FontFileName) - 1)];
                    if (!file_exists($fontFile))
                        imagestring($img, 4, self::$TextMargin + $j * self::$TextGap, ($H - rand($H / 2, $H)), self::$Code[$j], $foreColor);
                    else
                        imageTTFtext($img, rand(15, 18), rand(-15, 15), self::$TextMargin + $j * self::$TextGap, ($H - rand(7, 10)), $foreColor, $fontFile, self::$Code[$j]);
                }
                unset($foreColor);
            }

            ImageGif($img);
            Imagedestroy($img);
            $Imdata[] = ob_get_contents();
            OB_clean();
        }

        unset($W, $H, $B);
        if (self::$Debug) {
            echo $_SESSION['code'];
            echo '<pre>', Var_Dump($Imdata), '</pre>';
            die();
        }
        header('Content-type:image/gif');
        return self::CreateGif($Imdata, 20);
        unset($Imdata);
    }

    private static function CreateGif($GIF_src, $GIF_dly = 10, $GIF_lop = 0, $GIF_dis = 0, $GIF_red = 0, $GIF_grn = 0, $GIF_blu = 0, $GIF_mod = 'bin') {
        if (!is_array($GIF_src) && !is_array($GIF_tim)) {
            throw New Exception('Error:' . __LINE__ . ',Does not supported function for only one image!!');
            die();
        }
        self::$LOP = ($GIF_lop > -1) ? $GIF_lop : 0;
        self::$DIS = ($GIF_dis > -1) ? (($GIF_dis < 3) ? $GIF_dis : 3) : 2;
        self::$COL = ($GIF_red > -1 && $GIF_grn > -1 && $GIF_blu > -1) ? ($GIF_red | ($GIF_grn << 8) | ($GIF_blu << 16)) : -1;
        for ($i = 0, $src_count = count($GIF_src); $i < $src_count; $i++) {
            if (strToLower($GIF_mod) == 'url') {
                self::$BUF[] = fread(fopen($GIF_src[$i], 'rb'), filesize($GIF_src[$i]));
            } elseif (strToLower($GIF_mod) == 'bin') {
                self::$BUF[] = $GIF_src[$i];
            } else {
                throw New Exception('Error:' . __LINE__ . ',Unintelligible flag (' . $GIF_mod . ')!');
                die();
            }
            if (!(Substr(self::$BUF[$i], 0, 6) == 'GIF87a' Or Substr(self::$BUF[$i], 0, 6) == 'GIF89a')) {
                throw New Exception('Error:' . __LINE__ . ',Source ' . $i . ' is not a GIF image!');
                die();
            }
            for ($j = (13 + 3 * (2 << (ord(self::$BUF[$i]{10}) & 0x07))), $k = TRUE; $k; $j++) {
                switch (self::$BUF[$i]{$j}) {
                    case '!':
                        if ((substr(self::$BUF[$i], ($j + 3), 8)) == 'NETSCAPE') {
                            throw New Exception('Error:' . __LINE__ . ',Could not make animation from animated GIF source (' . ($i + 1) . ')!');
                            die();
                        }
                        break;
                    case ';':
                        $k = FALSE;
                        break;
                }
            }
        }
        self::AddHeader();
        for ($i = 0, $count_buf = count(self::$BUF); $i < $count_buf; $i++) {
            self::AddFrames($i, $GIF_dly);
        }
        self::$Img .= ';';
        return (self::$Img);
    }

    private static function AddHeader() {
        $i = 0;
        if (ord(self::$BUF[0]{10}) & 0x80) {
            $i = 3 * (2 << (ord(self::$BUF[0]{10}) & 0x07));
            self::$Img .= substr(self::$BUF[0], 6, 7);
            self::$Img .= substr(self::$BUF[0], 13, $i);
            self::$Img .= "!/377/13NETSCAPE2.0/3/1" . chr(self::$LOP & 0xFF) . chr((self::$LOP >> 8) & 0xFF) . "/0";
        }
        unset($i);
    }

    private static function AddFrames($i, $d) {
        $L_str = 13 + 3 * (2 << (ord(self::$BUF[$i]{10}) & 0x07));
        $L_end = strlen(self::$BUF[$i]) - $L_str - 1;
        $L_tmp = substr(self::$BUF[$i], $L_str, $L_end);
        $G_len = 2 << (ord(self::$BUF[0]{10}) & 0x07);
        $L_len = 2 << (ord(self::$BUF[$i]{10}) & 0x07);
        $G_rgb = substr(self::$BUF[0], 13, 3 * (2 << (ord(self::$BUF[0]{10}) & 0x07)));
        $L_rgb = substr(self::$BUF[$i], 13, 3 * (2 << (ord(self::$BUF[$i]{10}) & 0x07)));
        $L_ext = "!/xF9/x04" . chr((self::$DIS << 2) + 0) . chr(($d >> 0) & 0xFF) . chr(($d >> 8) & 0xFF) . "/x0/x0";
        if (self::$COL > -1 && ord(self::$BUF[$i]{10}) & 0x80) {
            for ($j = 0; $j < (2 << (ord(self::$BUF[$i]{10}) & 0x07)); $j++) {
                if (ord($L_rgb{3 * $j + 0}) == (self::$COL >> 0) & 0xFF && ord($L_rgb{3 * $j + 1}) == (self::$COL >> 8) & 0xFF && ord($L_rgb{3 * $j + 2}) == (self::$COL >> 16) & 0xFF) {
                    $L_ext = "!/xF9/x04" . chr((self::$DIS << 2) + 1) . chr(($d >> 0) & 0xFF) . chr(($d >> 8) & 0xFF) . chr($j) . "/x0";
                    break;
                }
            }
        }
        switch ($L_tmp{0}) {
            case '!':
                $L_img = substr($L_tmp, 8, 10);
                $L_tmp = substr($L_tmp, 18, strlen($L_tmp) - 18);
                break;
            case ',':
                $L_img = substr($L_tmp, 0, 10);
                $L_tmp = substr($L_tmp, 10, strlen($L_tmp) - 10);
                break;
        }
        if (ord(self::$BUF[$i]{10}) & 0x80 && self::$IMG > -1) {
            if ($G_len == $L_len) {
                if (self::Compare($G_rgb, $L_rgb, $G_len)) {
                    self::$Img .= ($L_ext . $L_img . $L_tmp);
                } else {
                    $byte = ord($L_img{9});
                    $byte |= 0x80;
                    $byte &= 0xF8;
                    $byte |= (ord(self::$BUF[0]{10}) & 0x07);
                    $L_img{9} = chr($byte);
                    self::$Img .= ($L_ext . $L_img . $L_rgb . $L_tmp);
                }
            } else {
                $byte = ord($L_img{9});
                $byte |= 0x80;
                $byte &= 0xF8;
                $byte |= (ord(self::$BUF[$i]{10}) & 0x07);
                $L_img{9} = chr($byte);
                self::$Img .= ($L_ext . $L_img . $L_rgb . $L_tmp);
            }
        } else {
            self::$Img .= ($L_ext . $L_img . $L_tmp);
        }
        self::$IMG = 1;
    }

    private static function Compare($G_Block, $L_Block, $Len) {
        for ($i = 0; $i < $Len; $i++) {
            if ($G_Block{3 * $i + 0} != $L_Block{3 * $i + 0} || $G_Block{3 * $i + 1} != $L_Block{3 * $i + 1} || $G_Block{3 * $i + 2} != $L_Block{3 * $i + 2}) {
                return (0);
            }
        }
        return (1);
    }

}


用法在類開頭的注釋里。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美理论电影在线观看| 午夜精品久久17c| 亚洲九九九在线观看| 色偷偷91综合久久噜噜| 亚洲精品国偷自产在线99热| 中文字幕不卡在线视频极品| 欧美激情综合色综合啪啪五月| 日本亚洲欧洲色| 国产精品成人一区二区| 91精品国产91久久久久福利| 亚洲中国色老太| 国产亚洲精品高潮| 日韩欧美在线视频免费观看| 欧美高清在线播放| 成人黄在线观看| 精品福利在线视频| 国产欧美日韩亚洲精品| 7m精品福利视频导航| 在线播放亚洲激情| 色777狠狠综合秋免鲁丝| 日韩中文字幕视频在线观看| 国产精品成人av在线| 国产一区二区免费| 成人信息集中地欧美| 亚洲激情中文字幕| 亚洲视频axxx| 久久久视频免费观看| 久久久人成影片一区二区三区观看| 欧美在线观看视频| 福利视频导航一区| 91久久久久久久久久| 欧美亚洲在线视频| 欧美日韩色婷婷| 色综合老司机第九色激情| 日韩精品有码在线观看| 91国产美女在线观看| 国产不卡精品视男人的天堂| 欧美激情一区二区三级高清视频| 中国日韩欧美久久久久久久久| 久久久久免费精品国产| 亚洲国产成人91精品| 欧美日韩在线观看视频| 国产精品视频永久免费播放| 久久99久久久久久久噜噜| 色中色综合影院手机版在线观看| 欧美精品在线播放| 57pao国产精品一区| 精品视频—区二区三区免费| 欧美精品情趣视频| 国产日韩欧美在线看| 亚洲国产成人久久综合| 亚洲欧美精品伊人久久| 欧美激情欧美狂野欧美精品| 亚洲一区二区三区777| 91在线国产电影| 亚洲xxxx做受欧美| 欧美激情精品久久久久久| 亚洲iv一区二区三区| 亚洲综合一区二区不卡| 欧美成人精品在线播放| 国产午夜精品久久久| 国产精品丝袜久久久久久高清| 精品呦交小u女在线| 欧美一区二粉嫩精品国产一线天| 欧美大学生性色视频| 亚洲国产精品高清久久久| 亚洲v日韩v综合v精品v| 欧美性生交大片免费| 亚洲午夜av电影| 在线播放国产一区中文字幕剧情欧美| 久久噜噜噜精品国产亚洲综合| 国产欧美久久一区二区| 国产午夜精品一区二区三区| 亚洲一区二区三区成人在线视频精品| 亚洲欧美综合精品久久成人| 午夜精品久久久久久久99黑人| 国产精品成人一区二区三区吃奶| 国内免费久久久久久久久久久| 亚洲精品456在线播放狼人| 国产成人福利夜色影视| 青草青草久热精品视频在线网站| 性欧美办公室18xxxxhd| 少妇久久久久久| 日韩欧美国产骚| 国产精品入口尤物| 97香蕉久久夜色精品国产| 国内精品久久久久久久久| 在线成人中文字幕| 91国内在线视频| 亚洲欧美中文日韩在线| 久久九九精品99国产精品| 最新69国产成人精品视频免费| 国产成人高潮免费观看精品| 97精品在线观看| 亚洲国产欧美在线成人app| 久久偷看各类女兵18女厕嘘嘘| 日本久久久久久久| 国语自产精品视频在线看抢先版图片| 91美女片黄在线观看游戏| 精品精品国产国产自在线| 日韩欧亚中文在线| 国产一区二区日韩精品欧美精品| 欧美亚洲午夜视频在线观看| 久久夜色精品亚洲噜噜国产mv| 国产精品美女午夜av| 1769国内精品视频在线播放| 欧美日韩中文字幕| 亚洲欧洲xxxx| 一本一本久久a久久精品牛牛影视| 亚洲精品久久久久久下一站| 亚洲精品电影在线观看| 亚洲欧美日韩高清| 欧美国产精品人人做人人爱| 欧美在线视频一二三| 2020国产精品视频| 在线日韩第一页| 另类少妇人与禽zozz0性伦| 欧美激情精品久久久久久免费印度| 成人精品视频99在线观看免费| 久热在线中文字幕色999舞| 久久免费精品视频| 欧美日韩一区二区免费在线观看| 国产精品高潮粉嫩av| 久久视频免费在线播放| 亚洲天堂第二页| 国产精品亚洲精品| 爽爽爽爽爽爽爽成人免费观看| 日本精品久久久久久久| 裸体女人亚洲精品一区| 亚洲小视频在线| 久久久成人的性感天堂| 国产成人aa精品一区在线播放| 国产在线视频不卡| 久久91精品国产| 国产精品视频自拍| 日韩美女在线播放| 欧美成人在线免费视频| 国产极品精品在线观看| 久久久女女女女999久久| 原创国产精品91| 色先锋资源久久综合5566| 久久久久久噜噜噜久久久精品| 亚洲二区在线播放视频| 国产一区在线播放| 亚洲亚裔videos黑人hd| 中文字幕日韩免费视频| 精品一区二区亚洲| 91精品国产色综合久久不卡98口| 国产精品自拍小视频| 91在线色戒在线| 少妇激情综合网| 一区二区在线视频| 国产精品h在线观看| 欧美日韩在线观看视频| 日韩精品高清在线观看| 亚洲国产女人aaa毛片在线| 欧美精品在线看| 亚洲福利影片在线| 日本道色综合久久影院| 福利一区视频在线观看| 日韩av日韩在线观看| 欧美国产视频日韩| 中文字幕亚洲天堂| 欧美激情a∨在线视频播放|