分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

自定义MVC框架之工具类-图像处理类

发布时间:2023-09-06 01:43责任编辑:赖小花关键词:MVC图像处理

截止目前已经改造了4个类:

ubuntu:通过封装验证码类库一步步安装php的gd扩展

自定义MVC框架之工具类-分页类的封装

自定义MVC框架之工具类-文件上传类

图像处理类:

1,图片加水印处理( 支持任意位置与九宫格位置 )

2,图片缩放处理( 等比缩放,不变形裁剪 )

 ?1 <?php ?2 ??3 class Image{ ?4 ????//文件路径 ?5 ????protected $path; ?6 ????//是否允许随机文件名称 ?7 ????protected $enableRandName; ?8 ????//文件类型 ?9 ????protected $type; 10 ????//错误号 11 ????protected $errorNo; 12 ????//错误信息 13 ????protected $errorInfo; 14 ?15 ????public function __construct( $_path = ‘./‘, $_enableRandName = true ){ 16 ????????$this->path = $_path; 17 ????????$this->enableRandName = $_enableRandName; 18 ????} 19 ?20 ????public function __get( $key ) { 21 ????????if( $key == ‘errorNo‘ ) { 22 ????????????return $this->errorNo; 23 ????????}else if( $key == ‘errorInfo‘ ) { 24 ????????????return $this->getErrorInfo(); 25 ????????} 26 ????} ?27 ????protected function getErrorInfo(){ 28 ????????$info = ‘‘; 29 ????????switch( $this->errorNo ){ 30 ????????????case 1000: 31 ????????????????$info = "水印或者图片源文件不存在"; ????????????????32 ????????????????break; 33 ????????????case 1001: 34 ????????????????$info = ‘水印图片的尺寸(宽或者高)大于图片本身‘; 35 ????????????????break; 36 ????????} 37 ????????return $info; 38 ????} 39 ?40 ????//获取图片信息 41 ????public static function getImageInfo( $imgPath ){ 42 ????????$data = getimagesize( $imgPath ); 43 ????????$info[‘width‘] = $data[0]; 44 ????????$info[‘height‘] = $data[1]; 45 ????????$info[‘mime‘] = $data[‘mime‘]; 46 ????????return $info; 47 ????} 48 ?49 ????/* 50 ?????* ???@srcImg 原图片 51 ?????* ???@waterImg 水印图片 52 ?????* ???@pos 水印位置 53 ?????* ???@alpha 透明度 54 ?????* ???@prefix 水印处理之后的图片前缀 55 ?????* */ 56 ????public function waterMark( $srcImg, $waterImg, $pos, $alpha, $prefix = ‘ghostwu_‘ ){ 57 ????????//检查图片和水印是否存在 58 ????????if( !file_exists( $srcImg ) ?59 ????????????|| !file_exists( $waterImg ) ) { 60 ????????????$this->errorNo = 1000; 61 ????????????return false; 62 ????????} ?63 ?64 ????????//获取图片和水印信息 65 ????????$srcImageInfo = self::getImageInfo( $srcImg ); 66 ????????$waterImageInfo = self::getImageInfo( $waterImg ); 67 ?68 ????????$this->type = explode( ‘/‘, $srcImageInfo[‘mime‘] )[1]; 69 ?70 ????????//检查水印和图片的尺寸, 水印是否能加在图片上 71 ????????if( !$this->check( $srcImageInfo, $waterImageInfo ) ) { 72 ????????????$this->errorNo = 1001; 73 ????????????return false; 74 ????????} 75 ?76 ????????//打开图片文件和水印文件资源 77 ????????$imgRes = self::openImage( $srcImg ); 78 ????????$waterRes = self::openImage( $waterImg ); 79 ?80 ????????//计算水印图片位置 ????81 ????????$waterPos = $this->calcPosition( $pos, $srcImageInfo, $waterImageInfo ); 82 ?83 ????????//合成水印图片 84 ????????imagecopymerge ( $imgRes, $waterRes, $waterPos[‘x‘], $waterPos[‘y‘], 0, 0, $waterImageInfo[‘width‘], $waterImageInfo[‘height‘], $alpha ); 85 ?86 ????????//得到文件的保存名字 87 ????????$saveName = $this->getFileName( $srcImg, $prefix ); 88 ?89 ????????//拼凑完整的文件名称 90 ????????$fullPath = rtrim( $this->path, ‘/‘ ) . ‘/‘ . $saveName; 91 ?????????92 ????????//保存添加水印后的文件 93 ????????$this->saveImage( $imgRes, $fullPath ); 94 ?95 ????????imagedestroy( $imgRes ); 96 ????????imagedestroy( $waterRes ); 97 ?98 ????????return $fullPath; 99 ????}100 101 ????protected function saveImage( $imgRes, $fullPath ){102 ????????$func = ‘image‘ . $this->type;103 ????????$func( $imgRes, $fullPath );104 ????}105 106 ????protected function getFileName( $imgPath, $prefix ){107 ????????if ( $this->enableRandName ) {108 ????????????$saveName = $prefix . uniqid() . ‘.‘ . $this->type;109 ????????}else {110 ????????????$saveName = $prefix . pathinfo( $imgPath )[‘filename‘] . ‘.‘ . $this->type;111 ????????}112 ????????return $saveName;113 ????}114 115 ????protected function calcPosition( $pos, $imageInfo, $waterImageInfo ){116 ????????$x = 0; $y = 0;117 ????????switch( $pos ) {118 ????????????case 1: //左上角119 ????????????????$x = 0; $y = 0;120 ????????????????break;121 ????????????case 2: //上中122 ????????????????$x = ( $imageInfo[‘width‘] - $waterImageInfo[‘width‘] ) / 2;123 ????????????????$y = 0;124 ????????????????break;125 ????????????case 3: //右上角126 ????????????????$x = $imageInfo[‘width‘] - $waterImageInfo[‘width‘];127 ????????????????$y = 0;128 ????????????????break;129 ????????????case 4: //左边中间130 ????????????????$x = 0;131 ????????????????$y = ( $imageInfo[‘height‘] - $waterImageInfo[‘height‘] ) / 2;132 ????????????????break;133 ????????????case 5: //正中间134 ????????????????$x = ( $imageInfo[‘width‘] - $waterImageInfo[‘width‘] ) / 2;135 ????????????????$y = ( $imageInfo[‘height‘] - $waterImageInfo[‘height‘] ) / 2;136 ????????????????break;137 ????????????case 6: //右边中间138 ????????????????$x = $imageInfo[‘width‘] - $waterImageInfo[‘width‘];139 ????????????????$y = ( $imageInfo[‘height‘] - $waterImageInfo[‘height‘] ) / 2;140 ????????????????break;141 ????????????case 7: //左下角142 ????????????????$x = 0;143 ????????????????$y = $imageInfo[‘height‘] - $waterImageInfo[‘height‘];144 ????????????????break;145 ????????????case 8: //中间下面146 ????????????????$x = ( $imageInfo[‘width‘] - $waterImageInfo[‘width‘] ) / 2;147 ????????????????$y = $imageInfo[‘height‘] - $waterInfo[‘height‘];148 ????????????????break;149 ????????????case 9: //右下角150 ????????????????$x = $imageInfo[‘width‘] - $waterImageInfo[‘width‘];151 ????????????????$y = $imageInfo[‘height‘] - $waterImageInfo[‘height‘];152 ????????????????break;153 ????????????case 0: //随机位置154 ????????????????$x = mt_rand( 0, $imageInfo[‘width‘] - $waterImageInfo[‘width‘] );155 ????????????????$y = mt_rand( 0, $imageInfo[‘height‘] - $waterImageInfo[‘height‘] );156 ????????????????break;157 ????????}158 ????????return [ ‘x‘ => $x, ‘y‘ => $y ];159 ????}160 161 ????public static function openImage( $imagePath ){162 ????????$mime = self::getImageInfo( $imagePath )[‘mime‘];163 ????????switch( $mime ){164 ????????????case ‘image/gif‘:165 ????????????????$im = imagecreatefromgif( $imagePath );166 ????????????????break;167 ????????????case ‘image/jpeg‘:168 ????????????????$im = imagecreatefromjpeg( $imagePath );169 ????????????????break;170 ????????????case ‘image/png‘:171 ????????????????$im = imagecreatefrompng( $imagePath );172 ????????????????break;173 ????????????case ‘image/wbmp‘:174 ????????????????$im = imagecreatefromwbmp( $imagePath );175 ????????????????break;176 ????????}177 ????????return $im;178 ????}179 180 ????public function check( $imgInfo, $waterInfo ){181 ????????if( $imgInfo[‘width‘] < $waterInfo[‘width‘]182 ???????????|| $imgInfo[‘height‘] < $waterInfo[‘height‘] ){183 ????????????return false;184 ????????}185 ????????return true;186 ????}187 188 ????/*189 ?????* @srcImg 原图片路径190 ?????* @dstImg 目标图片路径191 ?????* @newWidth 缩放后新的图片宽度192 ?????* @newHeight 缩放后新的图片高度193 ?????* */194 ????public function thumb( $srcImg, $newWidth, $newHeight, $prefix="thumb_" ){195 ????????$srcIm = self::openImage( $srcImg );196 ????????$srcInfo = self::getImageInfo( $srcImg );197 ????????$srcW = $srcInfo[‘width‘];198 ????????$srcH = $srcInfo[‘height‘];199 ????????$this->type = explode( ‘/‘, $srcInfo[‘mime‘] )[1];200 ????????$ratio_w = $newWidth / $srcW;201 ????????$ratio_h = $newHeight / $srcH;202 ????????$ratio = 1.0;203 204 ????????//缩放后的图片 宽度/高度 都比原图大或者小205 ????????if( ( $ratio_w < 1 && $ratio_h < 1 ) || ( $ratio_w > 1 && $ratio_h > 1 ) ) {206 ????????????if( $ratio_w < $ratio_h ) {207 ????????????????$ratio = $ratio_h;208 ????????????}else {209 ????????????????$ratio = $ratio_w;210 ????????????}211 ????????????$tmp_w = (int)( $newWidth / $ratio );212 ????????????$tmp_h = (int)( $newHeight / $ratio );213 ????????????$tmp_im = imagecreatetruecolor( $tmp_w, $tmp_h );214 ????????????//生成一个以原图片最大边长,比例为ratio的中间图像215 ????????????imagecopy( $tmp_im, $srcIm, 0, 0, 0, 0, $tmp_w, $tmp_h );216 ????????????//定义一个目标尺寸的图像217 ????????????$newIm = imagecreatetruecolor( $newWidth, $newHeight );218 ????????????imagecopyresampled( $newIm, $tmp_im, 0, 0, 0, 0, $newWidth, $newHeight, $tmp_w, $tmp_h );219 ????????}else {220 ????????//缩放后的图片 宽度/高度 一个比原图大, 另一个比原图小221 ????????????$ratio = $ratio_h > $ratio_w ? $ratio_h : $ratio_w; //取比例大的那个值222 223 ????????????$tmp_w=(int)($srcW * $ratio);224 ????????????$tmp_h=(int)($srcH * $ratio);225 ????????????$tmp_im = imagecreatetruecolor($tmp_w, $tmp_h);226 227 ????????????imagecopyresampled($tmp_im, $srcIm, 0, 0, 0, 0, $tmp_w, $tmp_h, $srcW, $srcH );228 229 ????????????$newIm = imagecreatetruecolor($newWidth, $newHeight);230 ????????????imagecopy($newIm, $tmp_im, 0, 0, 0, 0, $newWidth, $newHeight);231 ????????}232 ????????//处理后的文件的保存名字233 ????????$saveName = $this->getFileName( $newIm, $prefix );234 235 ????????//拼凑完整的文件名称236 ????????$fullPath = rtrim( $this->path, ‘/‘ ) . ‘/‘ . $saveName;237 ????????238 239 ????????$this->saveImage( $newIm, $fullPath );240 241 ????????imagedestroy( $newIm );242 243 ????????return $fullPath;244 ????}245 }246 247 $img = new Image();248 //$img->waterMark( ‘1.jpg‘, ‘logo.png‘, 5, 30 );249 echo $img->thumb( ‘1.jpg‘, 330, 495 );250 251 252 ?>
View Code

自定义MVC框架之工具类-图像处理类

原文地址:https://www.cnblogs.com/ghostwu/p/8482399.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved