用到两个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;