重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
我们对图片的处理主要是添加水印和等比缩放,在PHP中,封装一个类来实现两个功能。
专注于为中小企业提供网站设计制作、网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业玉州免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了1000+企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
源代码如下:
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_');