温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP中面向对象的图片处理类

发布时间:2020-06-05 08:34:42 来源:网络 阅读:380 作者:DemoHA 栏目:web开发

        我们对图片的处理主要是添加水印和等比缩放,在PHP中,封装一个类来实现两个功能。

源代码如下:

<?php /**  *图片处理  */ class Image {	//路径	private $path = './upload/';	//随机文件名	private $isRandName;	//初始化成员方法	public function __construct($path = null , $r = true)	{	if (!is_null($path)) {	$this->path = rtrim($path,'/').'/';	}	$this->isRandName = $r;	}	//water水印的方法	//源(图片 $dst)  目标(水印 $src)  位置(9宫格) 前缀($prefix) 透明度($tmd )	public function water($dst,$src,$pos = 9,$prefix = 'wa_', $tmd = 100)	{	//判断文件路径是否存在	$src = $this->path . $src;	if (!file_exists($dst) || !file_exists($src)) {	exit('图片或者水印不存在');	}	//获取图像(图片和水印)的相关信息	$dstInfo = self::getImageInfo($dst);	$srcInfo = self::getImageInfo($src);	//var_dump($dstInfo);	//判断宽高是否超过了目标图片的宽高	if (!$this->_checkSize($dstInfo,$srcInfo)) {	exit('水印图片的宽、高不合法');	}	//摆放位置  1 2 3 4 5 6 7 8 9 九宫格(3行3列)	$postion = self::getPostion($dstInfo,$srcInfo,$pos);	//打开图片	$dstRes = self::openImage($dst,$dstInfo);	$srcRes = self::openImage($src,$srcInfo);	//将两个图片合并在一起  通过两张图片信息将图片合并在一起  需要自定义一个方法	$newRes = $this->_mergeImage($dstRes,$srcRes,$postion,$dstInfo,$srcInfo,$tmd);	//判断是否允许随机命名【保存之前】	if ($this->isRandName) {	//路径 前缀 产生id .  后缀	//uniqid() 获取一个带前缀、基于当前时间微秒数的唯一ID	$path = $this->path.$prefix . uniqid(). '.' .$dstInfo['subfix'];	} else {	//路径 前缀 文件原名	$path = $this->path.$prefix . $dstInfo['basename'];	}	//保存图片	self::saveImage($newRes,$path,$dstInfo);	//销毁资源	p_w_picpathdestroy($dstRes);	p_w_picpathdestroy($srcRes);	//返回路径	}	//等比缩放	//源图片 宽 高 前缀	public function thump($dst,$width,$height,$prefix = 'thump_')	{	//判断文件是否存在	if (!file_exists($dst)) {	exit('文件路径不存在');	}	//获取图像的信息  没有信息就退出	$info = self::getImageInfo($dst);	//得到一个新的尺寸	$newSize = self::getNewSize($width,$height,$info);	//打开资源	$res = self::openImage($dst,$info);	//等比缩放这个资源  处理gif背景变黑的问题	$newRes = self::kidOfImage($res,$newSize,$info);	//保存	$path = $this->path.$prefix.$info['basename'];	self::saveImage($newRes,$path,$info);	//销毁资源	p_w_picpathdestroy($newRes);	//返回路径	return $path;	}	//等比缩放处理	private static function kidOfImage($srcImg, $size, $imgInfo)	{	$newImg = p_w_picpathcreatetruecolor($size["width"], $size["height"]);	$otsc = p_w_picpathcolortransparent($srcImg);	if ( $otsc >= 0 && $otsc < p_w_picpathcolorstotal($srcImg)) {	 $transparentcolor = p_w_picpathcolorsforindex( $srcImg, $otsc );	 $newtransparentcolor = p_w_picpathcolorallocate(	 $newImg,	 $transparentcolor['red'],	 $transparentcolor['green'],	 $transparentcolor['blue']	 );	 p_w_picpathfill( $newImg, 0, 0, $newtransparentcolor );	 p_w_picpathcolortransparent( $newImg, $newtransparentcolor );	}	p_w_picpathcopyresized( $newImg, $srcImg, 0, 0, 0, 0, $size["width"], $size["height"], $imgInfo["width"], $imgInfo["height"] );	p_w_picpathdestroy($srcImg);	return $newImg;	}	//得到一个新的尺寸	private static function getNewSize($width, $height, $imgInfo)	{	$size["width"] = $imgInfo["width"];   //将原图片的宽度给数组中的$size["width"]	$size["height"] = $imgInfo["height"];  //将原图片的高度给数组中的$size["height"]	if($width < $imgInfo["width"]) {	$size["width"] = $width;             //缩放的宽度如果比原图小才重新设置宽度	}	if ($width < $imgInfo["height"]) {	$size["height"] = $height;            //缩放的高度如果比原图小才重新设置高度	}	if($imgInfo["width"]*$size["width"] > $imgInfo["height"] * $size["height"]) {	$size["height"] = round($imgInfo["height"] * $size["width"] / $imgInfo["width"]);	} else {	$size["width"] = round($imgInfo["width"] * $size["height"] / $imgInfo["height"]);	}	return $size;	}	//获取图片的相关信息	public static function getImageInfo($path)	{	$data = [];	//获取图片大小	$info = getp_w_picpathsize($path);	//var_dump($info);	//根据打印出来的信息 将键所对应的值(文件的大小)赋值给data的数组中	$data['width'] = $info[0];	$data['height'] = $info[1];	$data['mime'] = $info['mime'];	//获取路径  后缀 文件名信息	$path = pathinfo($path);	//var_dump($path);die;	//根据打印出来的信息 将将键所对应的值(路径和文件名)赋值给data的数组中	$data['basename'] = $path['basename'];	$data['subfix'] = $path['extension'];	return $data;	}	//检查图片和水印的宽高	//将图片的宽高和水印的宽高进行比较	private function _checkSize($dstInfo,$srcInfo)	{	//水印的宽应该小于图片的宽度或者水印的高度应该小于图片的高度 ,只要其中一个不满足就不能继续	if ($dstInfo['width'] < $srcInfo['width'] || $dstInfo['height'] < $srcInfo['height']) {	return false;	}	return true;	}	//位置处理	public static function getPostion($dstInfo,$srcInfo,$pos)	{	switch ($pos) {	case 1:	$x = 0;	$y = 0;	break;	case 2:	$x = ceil(($dstInfo['width'] - $srcInfo['width']) / 2 );	$y = 0;	break;	case 3:	$x = $dstInfo['width'] - $srcInfo['width'];	$y = 0;	break;	case 4:	$x = 0;	$y = ceil(($dstInfo['height'] - $srcInfo['height']) / 2 );	break;	case 5:	$x = ceil(($dstInfo['width'] - $srcInfo['width']) / 2 );	$y = ceil(($dstInfo['height'] - $srcInfo['height']) / 2 );	break;	case 6:	$x = $dstInfo['width'] - $srcInfo['width'];	$y = ceil(($dstInfo['height'] - $srcInfo['height']) / 2 );	break;	case 7:	$x = 0;	$y = $dstInfo['height'] - $srcInfo['height'];	break;	case 8:	$x = ceil(($dstInfo['width'] - $srcInfo['width']) / 2 );	$y = $dstInfo['height'] - $srcInfo['height'];	break;	case 9:	$x = $dstInfo['width'] - $srcInfo['width'];	$y = $dstInfo['height'] - $srcInfo['height'];	break;	}	return ['x' => $x ,'y' =>$y];	}	//打开图片	//根据图片的类型打开相应的图片资源	private function openImage($path,$info)	{	switch ($info['mime']) {	case 'p_w_picpath/png':	case 'p_w_picpath/x-png':	$res = p_w_picpathcreatefrompng($path);	break;	case 'p_w_picpath/jpeg':	case 'p_w_picpath/jpg':	case 'p_w_picpath/pjpeg':	$res = p_w_picpathcreatefromjpeg($path);	break;	case 'p_w_picpath/gif':	$res = p_w_picpathcreatefromgif($path);	break;	case 'p_w_picpath/wbmp':	case 'p_w_picpath/bmp':	$res = p_w_picpathcreatefromwbmp($path);	break;	}	//var_dump($res);die;	return $res;	}	//合并图片 p_w_picpathcopymerge(图片,水印,图片坐标x,图片坐标y,水印坐标x,水印坐标y,透明度)	private function _mergeImage($dstRes,$srcRes,$postion,$dstInfo,$srcInfo,$tmd)	{	p_w_picpathcopymerge($dstRes,$srcRes,$postion['x'],$postion['y'],0,0,$srcInfo['width'],$srcInfo['height'],$tmd);	return $dstRes;	}	//保存图片处理方法	//参数:需要保存的图片资源,保存的路径,保存的信息	public static function saveImage($res,$path,$info)	{	//根据不同的图片类型选择不同的函数进行保存	switch ($info['mime']) {	case 'p_w_picpath/png':	case 'p_w_picpath/x-png':	p_w_picpathpng($res,$path);	break;	case 'p_w_picpath/jpeg':	case 'p_w_picpath/jpg':	case 'p_w_picpath/pjpeg':	p_w_picpathjpeg($res,$path);	break;	case 'p_w_picpath/gif':	p_w_picpathgif($res,$path);	break;	case 'p_w_picpath/wbmp':	case 'p_w_picpath/bmp':	p_w_picpathwbmp($res,$path);	break;	}	} }


测试代码:

$img = new Image(); /* $img->water('ly.png','logo.gif',3); $img->water('ly.png','logo.gif',4);*/ $img->thump('ly.png',100,100,'l1_');


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI