PHP編寫的圖片驗證碼類檔案分享方法

來源:互聯網
上載者:User

標籤:tcap   and   ack   hang   char   image   繪製   hex   定義   

適用於自訂的驗證碼類!

<?php

/* 
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
Class Image{

private $img;
public $width = 85;
public $height = 25;
public $code;
public $code_len = 4;
public $code_str = "329832983DSDSKDSLKQWEWQ2lkfDSFSDjfdsfdsjwlkfj93290KFDSKJFDSOIDSLK";
public $bg_color = ‘#DCDCDC‘;
public $font_size = 16;
public $font = ‘font.ttf‘;
public $font_color = ‘#000000‘;

//建立驗證碼餓字元創
public function create_code(){
$code = ‘‘;
for( $i=0;$i<$this->code_len;$i++ ){
$code .= $this->code_str[mt_rand(0, strlen($this->code_str)-1)];
}
return $this->code = $code;
}

//輸出映像
public function getImage(){
$w = $this->width;
$h = $this->height;
$bg_color = $this->bg_color;
$img = imagecreatetruecolor($w, $h);
$bg_color = imagecolorallocate($img, 
hexdec(substr($bg_color, 1,2)), hexdec(substr($bg_color, 3,2)), hexdec(substr($bg_color, 5,2)));
imagefill($img, 0, 0, $bg_color);
$this->img = $img;
$this->create_font();
$this->create_pix();
$this->show_code();
}


//寫入驗證碼
public function create_font(){
$this->create_code();
$color = $this->font_color;
$font_color = imagecolorallocate($this->img, hexdec(substr($color,1,2)), hexdec(substr($color, 3,2)), hexdec(substr($color,5,2)));
$x = $this->width/$this->code_len;
for( $i=0;$i<$this->code_len;$i++ ){
$txt_color = imagecolorallocate($this->img, mt_rand(0,100), mt_rand(0, 150), mt_rand(0, 200));
imagettftext($this->img, $this->font_size, mt_rand(-30, 30), $x*$i+mt_rand(3, 6), mt_rand($this->height/1.2, $this->height), $txt_color, $this->font , $this->code[$i]); 
//imagestring($this->img, $this->font_size, $x*$i+mt_rand(3, 6),mt_rand(0, $this->height/4) , $this->code[$i], $font_color);
}
$this->font_color = $font_color;
}

//畫幹擾線
public function create_pix(){
$pix_color= $this->font_color;
for($i=0;$i<100;$i++){
imagesetpixel($this->img, mt_rand(0, $this->width),mt_rand(0, $this->height), $pix_color);
}
for($j=0;$j<4;$j++){
imagesetthickness($this->img, mt_rand(1, 2));
imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $pix_color);
}
}

//得到驗證碼
public function getCode(){
return strtoupper($this->code);
}


//輸出驗證碼
private function show_code(){
header("Content-type:image/png");
imagepng($this->img);
imagedestroy($this->img);
}
}

我們再來看一例代碼:

產生圖片類型驗證碼,驗證碼包含數字和大寫字母,session中存放md5加密後的驗證碼

<?php
/**
* 圖片驗證碼類
* 產生圖片類型驗證碼,驗證碼包含數字和大寫字母,session中存放md5加密後的驗證碼

* 使用方法:
* $captcha = new Catpcha();
* $captcha->buildAndExportImage();

* 作 者: luojing
* 建立時間: 2013-3-27 上午11:42:12
*/
class Captcha {

private $width;//寬度
private $height; //高度
private $codeNum;//驗證碼字元數量
private $image;//驗證碼映像資源
private $sessionKey;//session中儲存的名字
private $captcha;//驗證碼字串
const charWidth = 10;//單個字元寬度,根據輸出字元大小而變

/**
* 建立驗證碼類,初始化相關參數
* @param $width 圖片寬度
* @param $height 圖片高度
* @param $codeNum 驗證碼字元數量
* @param $sessionKey session中儲存的名字
*/
function __construct($width = 50, $height = 20, $codeNum = 4, $sessionKey = ‘captcha‘) {
$this->width = $width;
$this->height = $height;
$this->codeNum = $codeNum;
$this->sessionKey = $sessionKey;

//保證最小高度和寬度
if($height < 20) {
$this->height = 20;
}
if($width < ($codeNum * self::charWidth + 10)) {//左右各保留5像素空隙
$this->width = $codeNum * self::charWidth + 10;
}
}

/**
* 構造並輸出驗證碼圖片
*/
public function buildAndExportImage() {
$this->createImage();
$this->setDisturb();
$this->setCaptcha();
$this->exportImage();
}

/**
* 構造映像,設定底色
*/
private function createImage() {
//建立映像
$this->image = imagecreatetruecolor($this->width, $this->height); 
//建立背景色
$bg = imagecolorallocate($this->image, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255)); 
//填充背景色
imagefilledrectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $bg);
}

/**
* 設定幹擾元素
*/
private function setDisturb() {

//設定幹擾點
for($i = 0; $i < 150; $i++) {
$color = imagecolorallocate($this->image, mt_rand(150, 200), mt_rand(150, 200), mt_rand(150, 200));
imagesetpixel($this->image, mt_rand(5, $this->width - 10), mt_rand(5, $this->height - 3), $color);
}

//設定幹擾線
for($i = 0; $i < 10; $i++) {
$color = imagecolorallocate($this->image, mt_rand(150, 220), mt_rand(150, 220), mt_rand(150, 220));
imagearc($this->image, mt_rand(-10, $this->width), mt_rand(-10, $this->height), mt_rand(30, 300), mt_rand(20, 200), 55, 44, $color);
}

//建立邊框色
$border = imagecolorallocate($this->image, mt_rand(0, 50), mt_rand(0, 50), mt_rand(0, 50));
//畫邊框
imagerectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $border);
}

/**
* 產生並繪製驗證碼
*/
private function setCaptcha() {
$str = ‘23456789ABCDEFGHJKLMNPQRSTUVWXYZ‘;
//產生驗證碼字元
for($i = 0; $i < $this->codeNum; $i++) {
$this->captcha .= $str{mt_rand(0, strlen($str) - 1)};
}
//繪製驗證碼
for($i = 0; $i < strlen($this->captcha); $i++) {
$color = imagecolorallocate($this->image, mt_rand(0, 200), mt_rand(0, 200), mt_rand(0, 200));
$x = floor(($this->width - 10)/$this->codeNum);
$x = $x*$i + floor(($x-self::charWidth)/2) + 5;
$y = mt_rand(2, $this->height - 20);
imagechar($this->image, 5, $x, $y, $this->captcha{$i}, $color);
}
}

/*
* 輸出映像,驗證碼儲存到session中
*/
private function exportImage() {
if(imagetypes() & IMG_GIF){
header(‘Content-type:image/gif‘);
imagegif($this->image);
} else if(imagetypes() & IMG_PNG){
header(‘Content-type:image/png‘); 
imagepng($this->iamge);
} else if(imagetypes() & IMG_JPEG) {
header(‘Content-type:image/jpeg‘); 
imagepng($this->iamge);
} else {
imagedestroy($this->image);
die("Don‘t support image type!");
}
//將驗證碼資訊儲存到session中,md5加密
if(!isset($_SESSION)){
session_start();

$_SESSION[$this->sessionKey] = md5($this->captcha);

imagedestroy($this->image); 
}

function __destruct() {
unset($this->width, $this->height, $this->codeNum,$this->captcha);
}
}

例三:

<?php
class ValidationCode {
private $width;
private $height;
private $codeNum;
private $image; //映像資源
private $disturbColorNum;
private $checkCode;
function __construct($width=80, $height=20, $codeNum=4){
$this->width=$width;
$this->height=$height;
$this->codeNum=$codeNum;
$this->checkCode=$this->createCheckCode();
$number=floor($width*$height/15);

if($number > 240-$codeNum){
$this->disturbColorNum= 240-$codeNum;
}else{
$this->disturbColorNum=$number;
}

}
//通過訪問該方法向瀏覽器中輸出映像
function showImage($fontFace=""){
//第一步:建立映像背景
$this->createImage();
//第二步:設定幹擾元素
$this->setDisturbColor();
//第三步:向映像中隨機畫出文本
$this->outputText($fontFace);
//第四步:輸出映像
$this->outputImage();
}

//通過調用該方法擷取隨機建立的驗證碼字串
function getCheckCode(){
return $this->checkCode;
}
private function createImage(){
//建立映像資源
$this->image=imagecreatetruecolor($this->width, $this->height);
//隨機背景色
$backColor=imagecolorallocate($this->image, rand(225, 255), rand(225,255), rand(225, 255));
//為背景添充顏色
imagefill($this->image, 0, 0, $backColor);
//設定邊框顏色
$border=imagecolorallocate($this->image, 0, 0, 0);
//畫出矩形邊框
imagerectangle($this->image, 0, 0, $this->width-1, $this->height-1, $border);
}
private function setDisturbColor(){
for($i=0; $i<$this->disturbColorNum; $i++){
$color=imagecolorallocate($this->image, rand(0, 255), rand(0, 255), rand(0, 255));
imagesetpixel($this->image, rand(1, $this->width-2), rand(1, $this->height-2), $color);
}
for($i=0; $i<10; $i++){
$color=imagecolorallocate($this->image, rand(200, 255), rand(200, 255), rand(200, 255));
imagearc($this->image, rand(-10, $this->width), rand(-10, $this->height), rand(30, 300), rand(20, 200), 55, 44, $color);
}
}

PHP編寫的圖片驗證碼類檔案分享方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.