欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-16 10:00:12
截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( 支持任意位置与九宫格位置 ) 2,图片缩放处理( 等比缩放,不变形裁剪 ) 1

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

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

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

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

图像处理类:

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

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

自定义MVC框架之工具类-图像处理类
  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