我们对图片的处理主要是添加水印和等比缩放,在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);

//销毁资源

imagedestroy($dstRes);

imagedestroy($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);

//销毁资源

imagedestroy($newRes);

//返回路径

return $path;

}

//等比缩放处理

private static function kidOfImage($srcImg, $size, $imgInfo)

{

$newImg = imagecreatetruecolor($size["width"], $size["height"]);

$otsc = imagecolortransparent($srcImg);

if ( $otsc >= 0 && $otsc < imagecolorstotal($srcImg)) {

$transparentcolor = imagecolorsforindex( $srcImg, $otsc );

$newtransparentcolor = imagecolorallocate(

$newImg,

$transparentcolor['red'],

$transparentcolor['green'],

$transparentcolor['blue']

);

imagefill( $newImg, 0, 0, $newtransparentcolor );

imagecolortransparent( $newImg, $newtransparentcolor );

}

imagecopyresized( $newImg, $srcImg, 0, 0, 0, 0, $size["width"], $size["height"], $imgInfo["width"], $imgInfo["height"] );

imagedestroy($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 = getimagesize($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 'image/png':

case 'image/x-png':

$res = imagecreatefrompng($path);

break;

case 'image/jpeg':

case 'image/jpg':

case 'image/pjpeg':

$res = imagecreatefromjpeg($path);

break;

case 'image/gif':

$res = imagecreatefromgif($path);

break;

case 'image/wbmp':

case 'image/bmp':

$res = imagecreatefromwbmp($path);

break;

}

//var_dump($res);die;

return $res;

}

//合并图片 imagecopymerge(图片,水印,图片坐标x,图片坐标y,水印坐标x,水印坐标y,透明度)

private function _mergeImage($dstRes,$srcRes,$postion,$dstInfo,$srcInfo,$tmd)

{

imagecopymerge($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 'image/png':

case 'image/x-png':

imagepng($res,$path);

break;

case 'image/jpeg':

case 'image/jpg':

case 'image/pjpeg':

imagejpeg($res,$path);

break;

case 'image/gif':

imagegif($res,$path);

break;

case 'image/wbmp':

case 'image/bmp':

imagewbmp($res,$path);

break;

}

}

}

测试代码:1

2

3

4

5

6$img =new Image();

/*$img->water('ly.png','logo.gif',3);

$img->water('ly.png','logo.gif',4);*/

$img->thump('ly.png',100,100,'l1_');

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐