249 lines
6.7 KiB
PHP
249 lines
6.7 KiB
PHP
<?php namespace App\Support;
|
||
|
||
/**
|
||
* 作者:Wang
|
||
* 创建时间:2006-12-18
|
||
* 修改时间:2012-11-22
|
||
* 类名:Image
|
||
* 功能:生成多种类型的缩略图
|
||
*/
|
||
|
||
/**
|
||
* 演示
|
||
* $img = new Image();
|
||
* $img->cut('imgx.jpg', 400, 280, 3, false);
|
||
* // 图片水印
|
||
* // $img->mark('logo1.png', '', 3);
|
||
* // 文字水印
|
||
* $img->mark('FV.Zone Test', 40, 3, 2, 2, 5, 5, '#ffffff', '#000000', 80, 20);
|
||
* // $img->save('ss.jpg');
|
||
* // $img->show();
|
||
* echo $img->msg();
|
||
*/
|
||
|
||
class Image
|
||
{
|
||
public $srcw;
|
||
|
||
public $srch;
|
||
|
||
public $destw;
|
||
|
||
public $desth;
|
||
|
||
// 原图类型
|
||
public $type;
|
||
|
||
// 生成的数据
|
||
public $cache;
|
||
|
||
public $image;
|
||
|
||
public $mime;
|
||
|
||
// 将16进制的颜色转换成10进制的(R, G, B)
|
||
public function hexdec($color)
|
||
{
|
||
$color = ltrim($color, '#');
|
||
$match = str_split($color, 2);
|
||
if (count($match) == 3) {
|
||
$rgb['r'] = hexdec($match[0]);
|
||
$rgb['g'] = hexdec($match[1]);
|
||
$rgb['b'] = hexdec($match[2]);
|
||
}
|
||
return $rgb;
|
||
}
|
||
|
||
// 水印函数
|
||
public function mark($source, $alpha = 100, $seat = 1, $type = 1, $font_type = 3, $font_x = 10, $font_y = 10, $font_bgcolor = '#ffffff', $font_color = '#000000', $font_w = 80, $font_h = 20)
|
||
{
|
||
// 图片水印
|
||
if ($type == 1) {
|
||
list($w, $h, $t) = getimagesize($source);
|
||
// 水印图片大于原图
|
||
if ($w > $this->srcw || $h > $this->srch) {
|
||
throw new Exception('水印图片大于原图。');
|
||
}
|
||
switch ($t) {
|
||
case 1:
|
||
$water = imagecreatefromgif($source);
|
||
break;
|
||
case 2:
|
||
$water = imagecreatefromjpeg($source);
|
||
break;
|
||
case 3:
|
||
$water = imagecreatefrompng($source);
|
||
imagesavealpha($water, true);
|
||
break;
|
||
}
|
||
|
||
// 文字水印
|
||
} else {
|
||
|
||
// 文字水印大于原图
|
||
if ($font_w > $this->srcw || $font_h > $this->srch) {
|
||
throw new Exception('文字水印大于原图。');
|
||
}
|
||
|
||
// 创建一个真彩色图片
|
||
$water = imagecreatetruecolor($font_w, $font_h);
|
||
|
||
// 转换文字颜色值
|
||
$font_color = $this->hexdec($font_color);
|
||
|
||
// 转换背景颜色值
|
||
$font_bgcolor = $this->hexdec($font_bgcolor);
|
||
|
||
$color = imagecolorallocate($water, $font_color['r'], $font_color['g'], $font_color['b']);
|
||
$bgcolor = imagecolorallocate($water, $font_bgcolor['r'], $font_bgcolor['g'], $font_bgcolor['b']);
|
||
|
||
// 背景色填充
|
||
imagefill($water, 0, 0, $bgcolor);
|
||
|
||
// 绘制文字
|
||
imageString($water, $font_type, $font_x, $font_y, $source, $color);
|
||
$w = $font_w;
|
||
$h = $font_h;
|
||
}
|
||
|
||
switch ($seat) {
|
||
case 1:
|
||
$x = 10;
|
||
$y = 0;
|
||
break;
|
||
case 2:
|
||
$x = ($this->destw - $w)/2;
|
||
$y = ($this->desth - $h)/2;
|
||
break;
|
||
case 3:
|
||
$x = $this->destw - $w - 10;
|
||
$y = $this->desth - $h - 10;
|
||
break;
|
||
default:
|
||
$x = 10;
|
||
$y = 0;
|
||
}
|
||
// png 24位,真彩色不需要透明设置
|
||
if ($t == 3) {
|
||
imagecopy($this->cache, $water, $x, $y, 0, 0, $w, $h);
|
||
} else {
|
||
imagecopymerge($this->cache, $water, $x, $y, 0, 0, $w, $h, $alpha);
|
||
}
|
||
}
|
||
|
||
public function crop($file, $width, $height, $mode, $center)
|
||
{
|
||
// 原文件不存在
|
||
if (!is_file($file)) {
|
||
throw new \Exception('原文件不存在。');
|
||
}
|
||
$temp = getimagesize($file);
|
||
$this->srcw = $srcw = $temp[0];
|
||
$this->srch = $srch = $temp[1];
|
||
$this->type = $temp[2];
|
||
|
||
// 1=gif 2=jpg 3=png
|
||
$this->mime = $temp['mime'];
|
||
switch ($this->type) {
|
||
case 1:
|
||
$image = imagecreatefromgif($file);
|
||
break;
|
||
case 2:
|
||
$image = imagecreatefromjpeg($file);
|
||
break;
|
||
case 3:
|
||
$image = imagecreatefrompng($file);
|
||
break;
|
||
}
|
||
|
||
if (!$image) {
|
||
return;
|
||
}
|
||
|
||
if (function_exists('imageantialias')) {
|
||
imageantialias($image, true);
|
||
}
|
||
|
||
// 原始宽高比大于目标宽高比, 则取目标
|
||
$this->image = $image;
|
||
$destw = $w = $width;
|
||
$desth = $h = $height;
|
||
$srcx = $srcy = 0;
|
||
|
||
// 按宽度等比例缩放
|
||
switch ($mode) {
|
||
case 1:
|
||
$desth = ceil($srch / $srcw * $destw);
|
||
break;
|
||
|
||
case 2:
|
||
$destw = ceil($srcw / $srch * $desth);
|
||
break;
|
||
|
||
case 3:
|
||
// 原始宽高比目标宽高大,调整原始复制宽度
|
||
if ($srcw/$srch > $w/$h) {
|
||
$oldw = $srcw;
|
||
$srcw = ceil($w / $h * $srch);
|
||
if ($center) {
|
||
$srcx = ceil(($oldw - $srcw)/2);
|
||
}
|
||
} else {
|
||
// 调整原始复制高度
|
||
$oldh = $srch;
|
||
$srch = ceil($h / $w * $srcw);
|
||
if ($center) {
|
||
$srcy = ceil(($oldh - $srch)/2);
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
|
||
$this->destw = $destw;
|
||
$this->desth = $desth;
|
||
$this->cache = imagecreatetruecolor($destw, $desth);
|
||
|
||
if (function_exists('imagecopyresampled')) {
|
||
imagecopyresampled($this->cache, $image, 0, 0, $srcx, $srcy, $destw, $desth, $srcw, $srch);
|
||
} else {
|
||
imagecopyresized($this->cache, $image, 0, 0, $srcx, $srcy, $destw, $desth, $srcw, $srch);
|
||
}
|
||
}
|
||
|
||
public function save($path, $quality = 100)
|
||
{
|
||
switch ($this->type) {
|
||
case 1:
|
||
imagegif($this->cache, $path);
|
||
break;
|
||
case 2:
|
||
imagejpeg($this->cache, $path, $quality);
|
||
break;
|
||
case 3:
|
||
imagepng($this->cache, $path);
|
||
break;
|
||
}
|
||
if ($this->image) {
|
||
imageDestroy($this->image);
|
||
}
|
||
}
|
||
|
||
public function display($quality = 100)
|
||
{
|
||
header("Content-type: $this->mime");
|
||
|
||
switch ($this->type) {
|
||
case 1:
|
||
imagegif($this->cache, $path);
|
||
break;
|
||
case 2:
|
||
imagejpeg($this->cache, $path, $quality);
|
||
break;
|
||
case 3:
|
||
imagepng($this->cache, $path);
|
||
break;
|
||
}
|
||
imageDestroy($this->image);
|
||
}
|
||
}
|