php 生成圖片驗證碼方法
阿新 • • 發佈:2018-12-14
昨天碰到一個需要自己寫圖片驗證碼的需要,我用的 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);//銷燬影象釋放記憶體
}