<?php

// 验证码类


class p_w_picpath {

protected $im;

protected $img_width;

protected $img_height;

protected $img_type;

// 生成随机数

static public function randStr($n = 4) {

if($n <= 0) {

return '';

}


$str = 'abcdefghijkmnpqrstuvwxyzABCDEFGHIJKMNPQRSTUVWXYZ0123456789';

$str = substr(str_shuffle($str),0,$n);


return $str;

}

// 生成验证码

static public function chkcode($w=60,$h=25) {

// $w 宽, $h 高

$code = self::randStr(4);


// 造画布

$im = p_w_picpathcreatetruecolor($w,$h);

$bak = p_w_picpathcreatetruecolor($w,$h);


// 造颜色,灰底+蓝字

$gray = p_w_picpathcolorallocate($im,100,100,100);

$blue = p_w_picpathcolorallocate($im,0,0,255);

$bak_gray = p_w_picpathcolorallocate($bak,100,100,100);

// 填充

p_w_picpathfill($im,0,0,$gray);

p_w_picpathfill($bak,0,0,$bak_gray);


// 写字

p_w_picpathstring($im,5,10,5,$code,$blue);


/*****

把验证码存储到session里

*****/


/*****

把验证码的字符扭曲,供参考,不要求.


$niu = 3;

for($i=0;$i<60;$i++) {

// 按正弦函数计算Y轴的波动

$y = sin(deg2rad((720/$w) * $i)) * $niu;

p_w_picpathcopy($bak,$im,$i,$y,$i,0,1,$h);

}

*****/


header('content-type: p_w_picpath/jpeg');

p_w_picpathjpeg($bak);

}


static public function make_thumb($ori,$w=200,$h=200) {

// 判断原图大小,如果原图比缩略还小,不必处理.


// 读出大图当画布

$info = self::getinfo($ori);

if($info['func'] === false) {

return false;

}


$createfunc = 'p_w_picpathcreatefrom' . $info['func']; // 分析出读取大图所用的函数名.

$src = $createfunc($ori);


// 创建小画布,并把背景做成灰色

$small = p_w_picpathcreatetruecolor($w,$h);

$gray = p_w_picpathcolorallocate($small,100,100,100);

p_w_picpathfill($small,0,0,$gray);


// 复制大图到小图

$scale = min($w/$info['width'], $h/$info['height']); // 以更小的缩小比例为准,才能装下


// 根据比例,算最终复制过去的块的大小.

$realw = $info['width'] * $scale;

$realh = $info['height'] * $scale;


// 生成小图

/*

bool p_w_picpathcopyresampled ( resource $dst_p_w_picpath , resource $src_p_w_picpath , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )

*/


// 计算留白

$lw = round(($w - $realw)/2); // 计算左侧留的宽度

$lh = round(($h - $realh)/2); // 计算上部留的高度


p_w_picpathcopyresampled($small,$src,$lw,$lh,0,0,$realw,$realh,$info['width'],$info['height']);


/*

header('content-type: p_w_picpath/jpeg');

p_w_picpathjpeg($small);

*/


// 计算小图片的存储路径

$thumburl = str_replace('.','_thumb.',$ori);

$p_w_picpathfunc = 'p_w_picpath' . $info['func'];


if($p_w_picpathfunc($small,$thumburl)) {

return str_replace(ROOT,'',$thumburl);

} else {

return false;

}



}


static public function getinfo($ori) {

$arr = getp_w_picpathsize($ori);


// 如果原始图片分析不出来,直接false

if($arr === false) {

return false;

}

$info = array();

$info['width'] = $arr[0];

$info['height'] = $arr[1];

switch($arr[2]) {

case 1:

$info['func'] = 'gif';

break;


case 2:

$info['func'] = 'jpeg';

break;


case 3:

$info['func'] = 'png';

break;


case 6:

$info['func'] = 'wbmp';

break;


default:

$info['func'] = false;

}


return $info;

}



}



p_w_picpath::chkcode();


?>