gdoo/app/Support/Image.php

249 lines
6.7 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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);
}
}