227 lines
6.7 KiB
PHP
227 lines
6.7 KiB
PHP
<?php
|
|
//生成图像缩略图和生成验证码
|
|
class Image {
|
|
//生成图像验证码
|
|
static public function buildImageVerify($width = 48, $height = 22, $randval = NULL, $verifyName = 'verify') {
|
|
if (!isset($_SESSION)) {
|
|
session_start();
|
|
//如果没有开启,session,则开启session
|
|
}
|
|
$randval = empty($randval) ? ("" . rand(1000, 9999)) : $randval;
|
|
$_SESSION[$verifyName] = $randval;
|
|
$length = 4;
|
|
$width = ($length * 10 + 10) > $width ? $length * 10 + 10 : $width;
|
|
$im = imagecreate($width, $height);
|
|
$r = array(225, 255, 255, 223);
|
|
$g = array(225, 236, 237, 255);
|
|
$b = array(225, 236, 166, 125);
|
|
$key = mt_rand(0, 3);
|
|
|
|
$backColor = imagecolorallocate($im, $r[$key], $g[$key], $b[$key]);
|
|
//背景色(随机)
|
|
$borderColor = imagecolorallocate($im, 100, 100, 100);
|
|
//边框色
|
|
$pointColor = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
|
|
//点颜色
|
|
|
|
@imagefilledrectangle($im, 0, 0, $width - 1, $height - 1, $backColor);
|
|
@imagerectangle($im, 0, 0, $width - 1, $height - 1, $borderColor);
|
|
$stringColor = imagecolorallocate($im, mt_rand(0, 200), mt_rand(0, 120), mt_rand(0, 120));
|
|
// 干扰
|
|
for ($i = 0; $i < 10; $i++) {
|
|
$fontcolor = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
|
|
imagearc($im, mt_rand(-10, $width), mt_rand(-10, $height), mt_rand(30, 300), mt_rand(20, 200), 55, 44, $fontcolor);
|
|
}
|
|
for ($i = 0; $i < 25; $i++) {
|
|
$fontcolor = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
|
|
imagesetpixel($im, mt_rand(0, $width), mt_rand(0, $height), $pointColor);
|
|
}
|
|
for ($i = 0; $i < $length; $i++) {
|
|
imagestring($im, 5, $i * 10 + 5, mt_rand(1, 8), $randval[$i], $stringColor);
|
|
}
|
|
self::output($im, 'png');
|
|
}
|
|
|
|
//生成缩略图
|
|
static public function thumb($image, $thumbname, $domain = 'public', $maxWidth = 200, $maxHeight = 50, $interlace = true) {
|
|
// 获取原图信息
|
|
$info = self::getImageInfo($image);
|
|
if ($info !== false) {
|
|
$srcWidth = $info['width'];
|
|
$srcHeight = $info['height'];
|
|
$type = strtolower($info['type']);
|
|
$interlace = $interlace ? 1 : 0;
|
|
unset($info);
|
|
$scale = min($maxWidth / $srcWidth, $maxHeight / $srcHeight);
|
|
// 计算缩放比例
|
|
if ($scale >= 1) {// 超过原图大小不再缩略
|
|
$width = $srcWidth;
|
|
$height = $srcHeight;
|
|
} else {// 缩略图尺寸
|
|
$width = (int)($srcWidth * $scale);
|
|
$height = (int)($srcHeight * $scale);
|
|
}
|
|
|
|
// 载入原图
|
|
$createFun = 'ImageCreateFrom' . ($type == 'jpg' ? 'jpeg' : $type);
|
|
$srcImg = $createFun($image);
|
|
|
|
//创建缩略图
|
|
if ($type != 'gif' && function_exists('imagecreatetruecolor')) {
|
|
$thumbImg = imagecreatetruecolor($width, $height);
|
|
} else {
|
|
$thumbImg = imagecreate($width, $height);
|
|
}
|
|
// 复制图片
|
|
if (function_exists("ImageCopyResampled")) {
|
|
imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);
|
|
} else {
|
|
imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);
|
|
}
|
|
if ('gif' == $type || 'png' == $type) {
|
|
$background_color = imagecolorallocate($thumbImg, 0, 255, 0);
|
|
// 指派一个绿色
|
|
imagecolortransparent($thumbImg, $background_color);
|
|
// 设置为透明色,若注释掉该行则输出绿色的图
|
|
}
|
|
// 对jpeg图形设置隔行扫描
|
|
if ('jpg' == $type || 'jpeg' == $type) {
|
|
imageinterlace($thumbImg, $interlace);
|
|
}
|
|
$dir = dirname($thumbname);
|
|
if (!is_dir($dir)) {
|
|
@mkdir($dir, 0777, true);
|
|
}
|
|
// 生成图片
|
|
$imageFun = 'image' . ($type == 'jpg' ? 'jpeg' : $type);
|
|
$imageFun($thumbImg, $thumbname);
|
|
imagedestroy($thumbImg);
|
|
imagedestroy($srcImg);
|
|
return $thumbname;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* 图片水印
|
|
* @$image 原图
|
|
* @$water 水印图片
|
|
* @$$waterPos 水印位置(0-9) 0为随机,其他代表上中下9个部分位置
|
|
*/
|
|
static public function water($image, $water, $waterPos = 9) {
|
|
//检查图片是否存在
|
|
if (!file_exists($image) || !file_exists($water))
|
|
return false;
|
|
//读取原图像文件
|
|
$imageInfo = self::getImageInfo($image);
|
|
$image_w = $imageInfo['width'];
|
|
//取得水印图片的宽
|
|
$image_h = $imageInfo['height'];
|
|
//取得水印图片的高
|
|
$imageFun = "imagecreatefrom" . $imageInfo['type'];
|
|
$image_im = $imageFun($image);
|
|
|
|
//读取水印文件
|
|
$waterInfo = self::getImageInfo($water);
|
|
$w = $water_w = $waterInfo['width'];
|
|
//取得水印图片的宽
|
|
$h = $water_h = $waterInfo['height'];
|
|
//取得水印图片的高
|
|
$waterFun = "imagecreatefrom" . $waterInfo['type'];
|
|
$water_im = $waterFun($water);
|
|
|
|
switch ($waterPos) {
|
|
case 0 :
|
|
//随机
|
|
$posX = rand(0, ($image_w - $w));
|
|
$posY = rand(0, ($image_h - $h));
|
|
break;
|
|
case 1 :
|
|
//1为顶端居左
|
|
$posX = 0;
|
|
$posY = 0;
|
|
break;
|
|
case 2 :
|
|
//2为顶端居中
|
|
$posX = ($image_w - $w) / 2;
|
|
$posY = 0;
|
|
break;
|
|
case 3 :
|
|
//3为顶端居右
|
|
$posX = $image_w - $w;
|
|
$posY = 0;
|
|
break;
|
|
case 4 :
|
|
//4为中部居左
|
|
$posX = 0;
|
|
$posY = ($image_h - $h) / 2;
|
|
break;
|
|
case 5 :
|
|
//5为中部居中
|
|
$posX = ($image_w - $w) / 2;
|
|
$posY = ($image_h - $h) / 2;
|
|
break;
|
|
case 6 :
|
|
//6为中部居右
|
|
$posX = $image_w - $w;
|
|
$posY = ($image_h - $h) / 2;
|
|
break;
|
|
case 7 :
|
|
//7为底端居左
|
|
$posX = 0;
|
|
$posY = $image_h - $h;
|
|
break;
|
|
case 8 :
|
|
//8为底端居中
|
|
$posX = ($image_w - $w) / 2;
|
|
$posY = $image_h - $h;
|
|
break;
|
|
case 9 :
|
|
//9为底端居右
|
|
$posX = $image_w - $w;
|
|
$posY = $image_h - $h;
|
|
break;
|
|
default :
|
|
//随机
|
|
$posX = rand(0, ($image_w - $w));
|
|
$posY = rand(0, ($image_h - $h));
|
|
break;
|
|
}
|
|
//设定图像的混色模式
|
|
imagealphablending($image_im, true);
|
|
imagecopy($image_im, $water_im, $posX, $posY, 0, 0, $water_w, $water_h);
|
|
//拷贝水印到目标文件
|
|
//生成水印后的图片
|
|
$bulitImg = "image" . $imageInfo['type'];
|
|
$bulitImg($image_im, $image);
|
|
//释放内存
|
|
$waterInfo = $imageInfo = null;
|
|
imagedestroy($image_im);
|
|
}
|
|
|
|
static protected function getImageInfo($img) {
|
|
$imageInfo = getimagesize($img);
|
|
if ($imageInfo !== false) {
|
|
$imageType = strtolower(substr(image_type_to_extension($imageInfo[2]), 1));
|
|
$imageSize = filesize($img);
|
|
$info = array("width" => $imageInfo[0], "height" => $imageInfo[1], "type" => $imageType, "size" => $imageSize, "mime" => $imageInfo['mime']);
|
|
return $info;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
static protected function output($im, $type = 'png', $filename = '') {
|
|
header("Content-type: image/" . $type);
|
|
$ImageFun = 'image' . $type;
|
|
if (empty($filename)) {
|
|
$ImageFun($im);
|
|
} else {
|
|
$ImageFun($im, $filename);
|
|
}
|
|
imagedestroy($im);
|
|
exit ;
|
|
}
|
|
|
|
}
|
|
?>
|