<?php
class Image
{
private function _getImageInfo($filename)
{
$imageInfo = getimagesize($filename);
$mime = $imageInfo['mime'];
$info = array(
"width" => $imageInfo[0],
"height" => $imageInfo[1],
"mime" => $mime,
"createFun" => str_replace('/', 'createfrom', $mime),
"outFun" => str_replace('/', '', $mime),
"ext" => image_type_to_extension(
$imageInfo[2]
)
);
return $info;
}
/**
* 返回缩略图的保存路径及文件名
*
* @param [type] $filename 文件名
* @param string $dest 文件存放的目录
* @param string $pre 文件名的前缀
* @param [type] $dst_w 缩略图的最大宽度
* @param [type] $dst_h 缩略图的最大高度
* @param float $scale 缩放比例
* @param boolean $delSource 是否删除源文件的标志
* @return void 文件存放的路径和文件名
*/
public function thumb($filename, $dest = 'thumb', $pre = 'thumb_', $dst_w = null, $dst_h = null, $scale = 0.5, $delSource = false)
{
//1.获取图片的信息
$info = $this->_getImageInfo($filename);
//2.得到源图片的宽高
$src_w = $info['width'];
$src_h = $info['height'];
//如果设置了宽和高,则算出源图片的宽高比例,
//通过小算法得知目标尺寸的比例是否大于源图片的比例,
//通过源图片的比例求出最大的图片缩放尺寸
if (is_numeric($dst_w) && is_numeric($dst_h)) {
$prop = $src_w / $src_h;
if ($dst_w / $dst_h > $prop) { // 目标文件比例大于源文件比例
$dst_w = $dst_h * $prop; // 宽=高*比例
} else { // 目标文件比例小于源文件比例
$dst_h = $dst_w / $prop; // 高 = 宽 / 比例
}
} else { // 如果没有设置宽和高,则按照事先固定好的缩放比例缩放
$dst_w = $src_w * $scale;
$dst_h = $src_h * $scale;
}
//3.创建图片资源
$src_image = $info['createFun']($filename);
$dst_image = imagecreatetruecolor($dst_w, $dst_h);
//4.进行缩放
imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
if ($dest && !file_exists($dest)) {
mkdir($dest, 0777, true);
}
$randNum = mt_rand(100000, 999999);
$dstName = "{$pre}{$randNum}" . $info['ext'];
$destination = $dest ? $dest . '/' . $dstName : $dstName;
//5.保存图片
$info['outFun']($dst_image, $destination);
//6.销毁资源
imagedestroy($dst_image);
imagedestroy($src_image);
// 如果$relSource 为真,则删除源文件
if ($delSource) {
unlink($filename);
}
// 返回文件存放的路径和文件名
return $destination;
}
/**
* 生成文字水印函数
*
* @param [string] $filename 文件名
* @param [string] $fontfile 字体文件名
* @param [string] $text 写的文字内容
* @param integer $size 字体大小
* @param integer $x x轴位置
* @param integer $y y轴位置
* @param integer $r red的数值 默认为255
* @param integer $g green的数值 默认为0
* @param integer $b blue的数值 默认为0
* @param integer $alpha 透明契合度 默认50
* @param [string] $dest 目录名称
* @param [string] $pre 文件前缀
* @param integer $angle 文字旋转角度
* @return void 文件存放路径及文件名
*/
public function water_text($filename, $fontfile, $text = '慕课网', $size = 28, $x = 0, $y = 30, $r = 255, $g = 0, $b = 0, $alpha = 60, $dest = 'waterText', $pre = 'waterText_', $angle = 0)
{
//获取图片信息
$info = $this->_getImageInfo($filename);
$image = $info['createFun']($filename);
//创建文字颜色
$color = imagecolorallocatealpha($image, $r, $g, $b, $alpha);
//写文字
imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);
//如果设置了目录且目录不存在则创建
if ($dest && !file_exists($dest)) {
mkdir($dest, 0777, true);
}
$randNum = mt_rand(100000, 999999);
$dstName = "{$pre}{$randNum}" . $info['ext'];
$destination = $dest ? $dest . '/' . $dstName : $dstName;
//保存图片
$info['outFun']($image, $destination);
//销毁资源
imagedestroy($image);
// 返回文件存放的路径和文件名
return $destination;
}
/**
* 图片水印制作函数
*
* @param [string] $dstName 目标图片文件名
* @param [string] $srcName 源图片文件名
* @param integer $pos 水印位置的标志 0--左上角 8--右下角
* @param integer $pct 两张图片的契合度数值
* @param string $dest 文件存放目录
* @param string $pre 文件前缀
* @param boolean $delSource 是否删除源文件的标志
* @return void 文件存放的路径及文件名
*/
public function water_pic($dstName, $srcName, $pos = 0, $pct = 50, $dest = 'waterPic', $pre = 'waterPic_', $delSource = false)
{
//得到源文件和目标文件的信息和创建资源
$dstInfo = $this->_getImageInfo($dstName);
$srcInfo = $this->_getImageInfo($srcName);
$dst_image = $dstInfo['createFun']($dstName);
$src_image = $srcInfo['createFun']($srcName);
$dst_w = $dstInfo['width'];
$dst_h = $dstInfo['height'];
$src_w = $srcInfo['width'];
$src_h = $srcInfo['height'];
$randNum = mt_rand(100000, 999999);
$destName = $pre . $randNum . $dstInfo['ext'];
$destination = $dest ? $dest . '/' . $destName : $destName;
//如果目录设置了且不存在则创建
if ($dest && !file_exists($dest)) {
mkdir($dest, 0777, true);
}
switch ($pos) {
case 0:
$x = 0;
$y = 0;
break;
case 1:
$x = ($dst_w - $src_w) / 2;
$y = 0;
break;
case 2:
$x = $dst_w - $src_w;
$y = 0;
break;
case 3:
$x = 0;
$y = ($dst_h - $src_h) / 2;
break;
case 4:
$x = ($dst_w - $src_w) / 2;
$y = ($dst_h - $src_h) / 2;
break;
case 5:
$x = $dst_w - $src_w;
$y = ($dst_h - $src_h) / 2;
break;
case 6:
$x = 0;
$y = $dst_h - $src_h;
break;
case 7:
$x = ($dst_w - $src_w) / 2;
$y = $dst_h - $src_h;
break;
case 8:
$x = $dst_w - $src_w;
$y = $dst_h - $src_h;
break;
default:
$x = 0;
$y = 0;
break;
}
//两张图片合并
imagecopymerge($dst_image, $src_image, $x, $y, 0, 0, $src_w, $src_h, $pct);
//保存图片
$dstInfo['outFun']($dst_image, $destination);
//销毁资源
imagedestroy($dst_image);
imagedestroy($src_image);
if ($delSource) {
unlink($dstName);
}
//返回保存路径及文件名
return $destination;
}
}
网友评论