我们对图片的处理主要是添加水印和等比缩放,在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); //销毁资源 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; } } }
测试代码:
$img = new Image(); /* $img->water(‘ly.png‘,‘logo.gif‘,3); $img->water(‘ly.png‘,‘logo.gif‘,4);*/ $img->thump(‘ly.png‘,100,100,‘l1_‘);
时间: 2024-11-07 20:39:28