You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
235 lines
6.8 KiB
235 lines
6.8 KiB
<?php
|
|
|
|
/**
|
|
* GD图片处理驱动
|
|
*/
|
|
|
|
namespace libraries\image;
|
|
|
|
class GdDriver implements ImageInterface {
|
|
|
|
protected $imgRes;
|
|
|
|
protected $info = array();
|
|
|
|
protected $errorMsg = '';
|
|
|
|
/**
|
|
* 构建函数
|
|
* @param string $img 图片路径
|
|
*/
|
|
public function __construct($img) {
|
|
if(!is_file($img)){
|
|
$this->errorMsg = '图片不存在!';
|
|
return false;
|
|
}
|
|
$imgInfo = getimagesize($img);
|
|
if(empty($imgInfo)){
|
|
$this->errorMsg = '非法图像资源!';
|
|
return false;
|
|
}
|
|
$this->info = array(
|
|
'width' => $imgInfo[0],
|
|
'height' => $imgInfo[1],
|
|
'type' => image_type_to_extension($imgInfo[2], false),
|
|
'mime' => $imgInfo['mime'],
|
|
);
|
|
$img = file_get_contents($img);
|
|
$this->imgRes = @imagecreatefromstring($img);
|
|
}
|
|
|
|
/**
|
|
* 裁剪图片
|
|
* @param integer $w 图片宽度
|
|
* @param integer $h 图片高度
|
|
* @param integer $x X坐标
|
|
* @param integer $y Y坐标
|
|
* @param integer $width 目标宽度
|
|
* @param integer $height 目标高度
|
|
* @return object
|
|
*/
|
|
public function crop($w, $h, $x = 0, $y = 0, $width = null, $height = null) {
|
|
if(empty($this->imgRes)){
|
|
$this->errorMsg = '图像处理失败!';
|
|
return false;
|
|
}
|
|
empty($width) && $width = $w;
|
|
empty($height) && $height = $h;
|
|
$img = imagecreatetruecolor($width, $height);
|
|
$color = imagecolorallocate($img, 255, 255, 255);
|
|
imagefill($img, 0, 0, $color);
|
|
imagecopyresampled($img, $this->imgRes, 0, 0, $x, $y, $width, $height, $w, $h);
|
|
imagedestroy($this->imgRes);
|
|
$this->imgRes = $img;
|
|
$this->info['width'] = $width;
|
|
$this->info['height'] = $height;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* 缩放图片
|
|
* @param integer $width 图片宽度
|
|
* @param integer $height 图片高度
|
|
* @param string $type 缩放类型
|
|
* @return object
|
|
*/
|
|
public function thumb($width, $height, $type = 'scale'){
|
|
$w = $this->info['width'];
|
|
$h = $this->info['height'];
|
|
switch ($type) {
|
|
//等比缩放
|
|
case 'scale':
|
|
if($w < $width && $h < $height) return;
|
|
$scale = min($width/$w, $height/$h);
|
|
$x = $y = 0;
|
|
$width = $w * $scale;
|
|
$height = $h * $scale;
|
|
break;
|
|
//居中裁剪缩放
|
|
case 'center':
|
|
$scale = max($width/$w, $height/$h);
|
|
$w = $width/$scale;
|
|
$h = $height/$scale;
|
|
$x = ($this->info['width'] - $w)/2;
|
|
$y = ($this->info['height'] - $h)/2;
|
|
break;
|
|
//固定尺寸
|
|
case 'fixed':
|
|
$x = $y = 0;
|
|
break;
|
|
default:
|
|
throw new \Exception('无此缩图类型!');
|
|
}
|
|
$this->crop($w, $h, $x, $y, $width, $height);
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
* 图片水印
|
|
* @param string $source 水印图片
|
|
* @param integer $locate 水印位置
|
|
* @param integer $alpha 水印透明度
|
|
* @return object
|
|
*/
|
|
public function water($source, $locate = 0, $alpha=80){
|
|
if(empty($this->imgRes)){
|
|
$this->errorMsg = '图像处理失败!';
|
|
return false;
|
|
}
|
|
$info = getimagesize($source);
|
|
if(!$info){
|
|
throw new \Exception('非法图像资源!');
|
|
}
|
|
$fun = 'imagecreatefrom' . image_type_to_extension($info[2], false);
|
|
$water = $fun($source);
|
|
imagealphablending($water, true);
|
|
if(!$locate){
|
|
$locate = rand(1,9);
|
|
}
|
|
switch ($locate) {
|
|
//左上角水印
|
|
case 1:
|
|
$x = $y = 0;
|
|
break;
|
|
//上居中水印
|
|
case 2:
|
|
$x = ($this->info['width'] - $info[0])/2;
|
|
$y = 0;
|
|
break;
|
|
//右上角水印
|
|
case 3:
|
|
$x = $this->info['width'] - $info[0];
|
|
$y = 0;
|
|
break;
|
|
//左居中水印
|
|
case 4:
|
|
$x = 0;
|
|
$y = ($this->info['height'] - $info[1])/2;
|
|
break;
|
|
//居中水印
|
|
case 5:
|
|
$x = ($this->info['width'] - $info[0])/2;
|
|
$y = ($this->info['height'] - $info[1])/2;
|
|
break;
|
|
//右居中水印
|
|
case 6:
|
|
$x = $this->info['width'] - $info[0];
|
|
$y = ($this->info['height'] - $info[1])/2;
|
|
break;
|
|
//左下角水印
|
|
case 7:
|
|
$x = 0;
|
|
$y = $this->info['height'] - $info[1];
|
|
break;
|
|
//下居中水印
|
|
case 8:
|
|
$x = ($this->info['width'] - $info[0])/2;
|
|
$y = $this->info['height'] - $info[1];
|
|
break;
|
|
//右下角水印
|
|
case 9:
|
|
$x = $this->info['width'] - $info[0];
|
|
$y = $this->info['height'] - $info[1];
|
|
break;
|
|
}
|
|
$src = imagecreatetruecolor($info[0], $info[1]);
|
|
$color = imagecolorallocate($src, 255, 255, 255);
|
|
imagefill($src, 0, 0, $color);
|
|
imagecopy($src, $this->imgRes, 0, 0, $x, $y, $info[0], $info[1]);
|
|
imagecopy($src, $water, 0, 0, 0, 0, $info[0], $info[1]);
|
|
imagecopymerge($this->imgRes, $src, $x, $y, 0, 0, $info[0], $info[1], $alpha);
|
|
imagedestroy($src);
|
|
imagedestroy($water);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* 输出图片
|
|
* @param string $filename 文件名
|
|
* @param string $type 图片类型
|
|
* @return boolean
|
|
*/
|
|
public function output($filename, $type = null){
|
|
if(empty($this->imgRes)){
|
|
$this->errorMsg = '图像处理失败!';
|
|
return false;
|
|
}
|
|
if(!$type){
|
|
$type = $this->info['type'];
|
|
} else {
|
|
$type = strtolower($type);
|
|
}
|
|
if('jpeg' == $type || 'jpg' == $type){
|
|
$func = 'imagejpeg';
|
|
}else{
|
|
$func = 'image'.$type;
|
|
}
|
|
if (!function_exists($func)) {
|
|
$this->error = '无法对该图片格式进行处理!';
|
|
return false;
|
|
}
|
|
return $func($this->imgRes, $filename);
|
|
}
|
|
|
|
/**
|
|
* 获取错误信息
|
|
*/
|
|
public function getError() {
|
|
return $this->errorMsg;
|
|
}
|
|
|
|
/**
|
|
* 获取图片信息
|
|
*/
|
|
public function getInfo() {
|
|
return $this->info;
|
|
}
|
|
|
|
/**
|
|
* 析构函数
|
|
*/
|
|
public function __destruct() {
|
|
imagedestroy($this->imgRes);
|
|
}
|
|
}
|