温馨提示×

温馨提示×

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

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

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

发布时间:2020-06-05 08:34:42 来源:网络 阅读:356 作者: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