PHP面向对象——GD库实现图片水印和缩略图
2017-03-16 17:56
477 查看
今天的实现目标就是使用GD库完成对图片加水印和图
片缩略图两个功能
法
接下来完善类中的方法
获取图片信息
检查目标图片与水印图片大小是不是
匹配
根据需要
确定水印的位置
这里将图片分成九宫格
1 2 3
4 5 6
7 8 9
根据图片的mime类型创建图片资源
给原图加上水印
保存图片
完成水印生成的公共方法
重新计算缩略后的图成比例的宽
高问题
解决可能出现的黑边问题
片缩略图两个功能
动身前逻辑准备
属性: 路径 功能: 构造方法 生成水印的方法 获取 图片信息 获取位置信息(123 456 789) 创建图片资源 合并图片资源 重新命名 保存图片 生成缩 略图的方法 获取图片信息 获取需要缩放的图片大小 创建图片资源 处理一下可能出现的黑边问题 重新命名 保存图片
接下来将文字描述转换为代码
首先,创建一个Image类,包含属性和构造方法
class Image() { //定义图片路径 static $path = '/'; //构造方法 public function __construct($path = '/') { $this->path = rtrim($path,'').'/'; } }
接下来完善类中的方法
获取图片信息
static private function getImageInfo($imgPath) { $info = getimagesize($imgPath); return array( 'width' => $info [0], 'height'=> $info[1], 'mime' => $info['mime'], 'name' => basename($imgPath) ); }
检查目标图片与水印图片大小是不是
匹配
static private function checksize($dstImgInfo,$waterImgInfo) { if ($waterImgInfo['width'] > $dstImgInfo['width'] || $waterImgInfo['height'] > $dstImgInfo ['height']) { return false; } else { return true; } }
根据需要
确定水印的位置
这里将图片分成九宫格
1 2 3
4 5 6
7 8 9
static private function getPosition($dstImgInfo,$waterImgInfo,$postion) { switch ($position) { case 1: $x = 0; $y = 0; break; case 2: $x = ceil(($desImgInfo['width'] - $waterImgInfo['width']) / 2); $y = 0; break; case 3: $x = $dstImgInfo['width'] - $waterImgInfo['width']; $y = 0; case 4: $x = 0; $y = ceil(($dstImgInfo['height'] - $waterImgInfo ['height']) / 2); break; case 5: $x = ceil(($desImgInfo['width'] - $waterImgInfo['width']) / 2); $y = ceil(($dstImgInfo['height'] - $waterImgInfo ['height']) / 2); break; case 6: $x = $dstImgInfo['width'] - $waterImgInfo['width']; $y = ceil(($dstImgInfo['height'] - $waterImgInfo['height']) / 2); break; case 7: $x = 0; $y = $dstImgInfo['height'] - $waterImgInfo['height']; break; case 8: $x = ceil(($desImgInfo ['width'] - $waterImgInfo['width']) / 2); $y = $dstImgInfo['height'] - $waterImgInfo['height']; break; case 9: $x = $dstImgInfo['width'] - $waterImgInfo['width']; $y = $dstImgInfo['height'] - $waterImgInfo['height']; } return [ 'x' => $x, 'y' => $y ]; }
根据图片的mime类型创建图片资源
static private function createImgRes ($imgPath,$imgInfo) { switch ($imgInfo['mime']) { case 'image/jpg': case 'image/jpeg': case 'image/pjpeg': $res = imagecreatefromjpeg($imgPath); break; case 'image/png': case 'image/x-png': $res = imagecreatefrompng ($imgPath); break; case 'image/gif': $res = imagecreatefromgif ($imgPath); break; case 'image/bmp': case 'image/wbmp': $res = imagecreatefromwbmp($imgPath); break; default: exit('图片我们不支持!'); break; } return $res; }
给原图加上水印
static private function merge($dstImgRes,$waterImgRes,$waterImgInfo,$pos,$opacity) { imagecopymerge($dstImgRes, $waterImgRes, $pos['x'], $pos['y'], 0, 0, $waterImgInfo ['width'], $waterImgInfo['height'], $opacity); return $dstImgRes; }
保存图片
static private function saveImg($newImgRes,$newPath,$dstImgInfo) { switch ($dstImgInfo['mime']) { case 'image/jpg': case 'image/jpeg': case 'image/pjpeg': $res = imagejpeg($newImgRes,$newPath); break; case 'image/png': case 'image/x-png': $res = imagepng($newImgRes,$newPath); break; case 'image/gif': $res = imagegif($imgPath); break; case 'image/bmp': case 'image/wbmp': $res = imagewbmp($newImgRes,$newPath); break; default: exit('您的破图片我们不支持!'); break; } }
完成水印生成的公共方法
/* $dstImg:原图像 *$waterImg:水印图片 *$postion:水印的位置 *$prefix:最终生成水印的图片名称前缀 *$opacity:水印透明度 */ static public function water($dstImg,$waterImg,$position = 9,$prefix = 'water_',$opacity = 50) { //判断图片是否存在 $dstImg = self::$path.$dstImg; if(!file_exists($dstImg)) { exit('目标图片不存在'); } if(!file_exists ($waterImg)) { exit('水印图片不存在'); } //通过自己定义的函数来获取图片和水印 图片的信息 $dstImgInfo = self::getImageInfo($dstImg); $waterImgInfo = self::getImageInfo ($waterImg); //检查图片大小的函数 if(!self::checkSize($dstImgInfo,$waterImgInfo)) { exit('水印图片大小不能超过目标图片的大小'); } //获取水印在目标图片的位置 $pos = self::getPosition($dstImgInfo,$waterImgInfo,$position); //创建图片资源,准备合并 $dstImgRes = self::createImgRes($dstImg,$dstImgInfo); $waterImgRes = self::createImgRes ($waterImg,$waterImgInfo); //合并图片,生成新图片 $newImgRes = self::merge ($dstImgRes,$waterImgRes,$waterImgInfo,$pos,$opacity); $newPath = self::$path. $prefix.uniqid().$dstImgInfo['name']; imagedestroy($dstImgRes); imagedestroy ($waterImgRes); imagedestroy($newImgRes); //生成新图片 self::saveImg($newImgRes, $newPath,$dstImgInfo); return $newPath; }
上述面是给图片加水印的全部方法,接下来完成
图片缩略图//生成缩略图的方法 static public function thump($img,$width,$height, $prefix = 'thump_') { if(!file_exists($img)) { exit('破图片不存在'); } //获取图片的信息 //getImageInfo()自 定义函数 $imgInfo = self::getImageInfo($img); //创建图片资源 //createImgRes()自定义函数 $imgRes = self::createImgRes($img, $imgInfo); //获取新的大小 //getNewSize()自定义函数--->得到最新的大小 $newSize = self::getNewSize($width,$height,$imgInfo); //解决黑边问题 //kidOfImage()自定义函数 $newImgRes = self::kidOfImage($imgRes, $newSize, $imgInfo); //拼装缩略后的新的图片名字 $newPath = $prefix.$newSize['width'].'X'.$newSize['height'].$imgInfo['name']; //保存图片 self::saveImg($newImgRes,$newPath,$imgInfo); imagedestroy($newImgRes); //返回新的路径 return $newPath; }
重新计算缩略后的图成比例的宽
高问题
static private function getNewSize($width,$height,$imgInfo) { $size = []; //判断缩略后的图的宽度,是不是比原图小 if($imgInfo ['width'] > $width) { $size['width'] = $width; } //判断缩略图的高度是不是比原图小 if($imgInfo['height'] > $height) { $size['height'] = $height; } //即使小了,但是不成比例也不可以 //如果缩略后的宽度是合适的,那么按 照比例重新设高度 if($imgInfo['width'] * $size['width'] > $imgInfo['height'] * $imgInfo['height']) { $size['height'] = $imgInfo ['height'] * $size['width'] / $imgInfo['width']; }else{ // 缩略后的高度是合适的,按照比例重新设置宽度 $size['width'] = $imgInfo ['width'] * $size['height'] / $imgInfo['height']; } return $size; }
解决可能出现的黑边问题
static private 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; } }
使用方式
Image::water('zhyunfe-com.jpg','2.jpg'); Image::thump('./zhyunfe-com.jpg',50,50);
相关文章推荐
- PHP面向对象——GD库实现图片水印和缩略图
- PHP---GD库实现图片水印与缩略图
- php实现常见图片格式的水印和缩略图制作(面向对象)
- php实现常见图片格式的水印和缩略图制作(面向对象)
- php封装成类(GD库实现文字、图片水印、压缩图)
- GD库实现图片水印及缩略图
- 使用gd库实现php服务端图片裁剪和生成缩略图功能分享
- php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
- 利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现
- EvaThumber : 基于URL的图片处理库 (可实现缩略图 | 二维码 | 水印 | 面部识别等,基于PHP)
- php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
- PHP 开发学习[3] —— 文字水印,缩略图,图片水印实现类
- PHP基于GD库实现的生成图片缩略图函数示例
- PHP Imagick完美实现图片裁切、生成缩略图、添加水印
- php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
- PHP Imagick完美实现图片裁切、生成缩略图、添加水印
- php下图片文字混合水印与缩略图实现代码
- php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
- php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码