用到两个image系统函数
imagecopymerge — 拷贝并合并图像的一部分
imagecopyresampled — 重采样拷贝部分图像并调整大小
/*
如何知道图片的大小和类型
无法确认调用函数:Imagecreatefrompng/jpeg……
可以独处图片的宽和高
相当于宽高是已知的
一个重要的函数getimagesize()
*/
/*
想操作图片
先把图片的大小,类型信息得到
水印:就是把指定的水印复制到目标上,并加透明效果
缩略图:就是把大图片复制到小尺寸画面上
*/
class ImageTool{
//imageinfo 分析图片的信息
//return array()
public static function imageInfo($image){
//判断图片是否存在
if(!file_exists($image)){
return false;
}
$info = getimagesize($image);
if($info == false){
return false;
}
//此时info分析出来是一个数组
$img['width'] = $info[0];
$img['height'] = $info[1];
//分析图片的后缀
$img['ext'] = substr($info['mime'],strpos($info['mime'],'/')+1);
return $img;
}
/*
加水印
string $dst 待操作图片
$water 水印小图
$save 不填,则默认替换原始图
$alpha 透明度
$pos 水印图放的位置1234,顺时针
*/
public static function water($dst,$water,$save=NULL,$pos=2,$alpha=50){
//先保证两个图片存在
if(!file_exists($dst) || !file_exists($water)){
return false;
}
//1.保证水印不能比待操作图片还大
$dinfo = self::imageInfo($dst);
$winfo = self::imageInfo($water);
//判断
if($winfo['height'] > $dinfo['height'] || $winfo['width'] > $dinfo['width']){
return false;
}
//两张图,读到画布上,但是图片可能是png,可能是jpeg,用什么函数来读
$dfunc = 'imagecreatefrom' .$dinfo['ext'];
$wfunc = 'imagecreatefrom' .$winfo['ext'];
if(!function_exists($dfunc) || !function_exists($wfunc)){
return false;
}
//动态加载函数来创建画布
$dim = $dfunc($dst); //创建待操作的画布
$wim = $wfunc($water); //创建水印画布
//根据水印的位置,计算粘贴的坐标
switch($pos){
case 0; //左上角
$posx = 0;
$posy = 0;
break;
case 1; //右上角
$posx = $dinfo['width'] - $winfo['width'];
$posy = 0;
break;
case 2; //左下角
$posx = 0;
$posy = $dinfo['height'] - $winfo['height'];
break;
default: //默认右下角
$posx = $dinfo['width'] - $winfo['width'];
$posy = $dinfo['height'] - $winfo['height'];
}
//加水印 在什么位置?
// imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )
imagecopymerge($dim,$wim,$posx,$posy,0,0,$winfo['width'],$winfo['height'],$alpha);
if(!$save){
$save=$dst;
unlink($dst); //删除原图
}
//保存图片
$createfunc = 'image' . $dinfo['ext'];
$createfunc($dim,$save);
//销毁图片
imagedestroy($dim);
imagedestroy($wim);
return true;
}
/*
thumb 生成缩略图
等比例缩放,两边留白
*/
public static function thumb($dst,$save=NULL,$width=200,$height=200){
//首先判断待处理的图片是否存在
$dinfo = self::imageInfo($dst);
if($dinfo == false){
return false;
}
//计算缩放比例
$calc = min($width/$dinfo['width'],$height/$dinfo['height']);
//创建原始图的画布
$dfunc = 'imagecreatefrom'.$dinfo['ext'];
$dim = $dfunc($dst);
//创建缩略图画布
$tim = imagecreatetruecolor($width,$height);
//创建白色填充缩略图画布
$white = imagecolorallocate($tim,255,255,255);
//填充缩略画布
imagefill($tim,0,0,$white);
//复制并缩略
$dwidth = (int)$dinfo['width']*$calc;
$dheight = (int)$dinfo['height']*$calc;
$paddingx = ($width - $dwidth) / 2;
$paddingy = ($height - $dheight) /2;
imagecopyresampled($tim,$dim,$paddingx,$paddingy,0,0,$dwidth,$dheight,$dinfo['width'],$dinfo['height']);
//保存图片
if(!$save){
$save = $dst;
unlink($dst);
}
$createfun = 'image'.$dinfo['ext'];
$createfun($tim,$save);
imagedestroy($dim);
imagedestroy($tim);
return true;
}
调用传参:
//调用传参 加水印
echo ImageTool::water('原图片地址','加水印图片地址','生成图片')?'ok':false;
//调用 缩略图
echo ImageTool::thumb('原图地址','生成图片地址',200,200)?'ok':false;