PHP.15-图片处理类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP.15-图片处理类相关的知识,希望对你有一定的参考价值。

图片处理类

test.php

 1 <?php
 2 
 3     include "images.class.php";
 4     
 5     $image=new Image("./images/");    
 6     
 7     //对图片进行缩放
 8     
 9     echo $image->thumb("hee.jpg",300,300,"th1_");
10     echo $image->thumb("hee.jpg",200,200,"th2_");
11     echo $image->thumb("hee.jpg",100,100,"th3_");
12     
13     //对图片进行加水印
14     echo $image->waterMark("mag.gif","gaolf.gif",2,"wa2_");
15     echo $image->waterMark("mag.gif","gaolf.gif",6,"wa6_");
16     echo $image->waterMark("mag.gif","gaolf.gif",7,"wa7_");
17 ?>

 

images.class.php

  1 <?php
  2     class Image {
  3         private $path;
  4         
  5         //构造方法用来对图片所在位置进行初始化
  6         function __construct($path="./"){
  7             
  8             $this->path=rtrim($path,"/")."/";    //用户在输入路径时,无斜杠则加斜杠,有斜杠则删掉再加上
  9         }
 10         
 11         /*    功能:对图片进行缩放
 12         *    
 13         *    参数$name:需处理的图片名称
 14         *    参数$width:缩放后的宽度
 15         *    参数$height:缩放后的高度
 16         *    参数$qz:新图片的名称前缀
 17         *    返回值:缩放后的图片名称,失败返回false
 18         *
 19         */
 20         function thumb($name,$width,$height,$qz="th_"){
 21             //获取图片信息
 22             $imgInfo=$this->getInfo($name);    //原图片的信息
 23             
 24             //获取图片资源,通用各种类型的图片(png,jpg,gif)
 25             $srcImg=$this->getImg($name,$imgInfo);
 26             
 27             //获取计算图片等比例之后的大小
 28             $size=$this->getNewSize($name,$width,$height,$imgInfo);
 29             
 30             //获取新的图片资源,处理gif透明背景问题
 31             $newImg=$this->kid0fImage($srcImg,$size,$imgInfo);
 32             
 33             //另存为一个新的图片,返回新的缩放后的图片名称
 34             return $this->createNewImage($newImg,$qz.$name,$imgInfo);
 35         }
 36         
 37         
 38         private function createNewImage($newImg,$newName,$imgInfo){
 39             //另存图片
 40             switch($imgInfo["type"]){
 41                 case 1:                //gif
 42                         $result=imagegif($newImg,$this->path.$newName);
 43                         break;
 44                 case 2:                //jpg
 45                         $result=imagejpeg($newImg,$this->path.$newName);
 46                         break;
 47                 case 3:                //png
 48                         $result=imagepng($newImg,$this->path.$newName);
 49                         break;
 50             }
 51             imagedestroy($newImg);
 52             return $newName;
 53         }
 54         private function kid0fImage($srcImg,$size,$imgInfo){
 55             //创建新图片资源
 56             
 57             $newImg=imagecreatetruecolor($size["width"],$size["height"]);
 58             
 59             //取出透明色指数
 60             $otsc=imagecolortransparent($srcImg);
 61             
 62             //判断是否有透明色    //()取得一幅图像的调色板中颜色的数目
 63             if($otsc >=0 && $otsc <= imagecolorstotal($srcImg)){
 64                 $tran = imagecolorsforindex($srcImg,$otsc);    //取得某索引的颜色
 65                 
 66                 $newt = imagecolorallocate($newImg,$tran["red"],$tran["green"],$tran["blue"]);    //为一幅图片分配颜色
 67                 
 68                 imagefill($newImg,0,0,$newt);    //填充颜色
 69                 
 70                 imagecolortransparent($newImg,$newt);    //将某个颜色定义为透明色
 71             }
 72             //拷贝部分图像并调整大小
 73             imagecopyresized($newImg, $srcImg, 0, 0, 0, 0, $size["width"], $size["height"], $imgInfo["width"], $imgInfo["height"]);
 74             
 75             imagedestroy($srcImg);
 76             return $newImg;
 77         }
 78 
 79         private function getNewSize($name,$width,$height,$imgInfo){
 80             $size["width"]=$imgInfo["width"];
 81             $size["height"]=$imgInfo["height"];
 82             //如果缩放后宽度小于原图片宽度,再重新设置图片宽度
 83             if($width < $imgInfo["width"]){
 84                 $size["width"]=$width;
 85             }
 86             //如果缩放后高度小于原图高度,再重新设置图片高度
 87             if($height < $imgInfo["height"]){
 88                 $size["height"]=$height;
 89             }
 90             
 91             //图片等比例缩放的算法
 92             if($imgInfo["width"]*$width > $imgInfo["height"]*$height){
 93                 $size["height"]=round($imgInfo["height"]*$size["width"]/$imgInfo["width"]);
 94             }else{
 95                 $size["width"]=round($imgInfo["width"]*$size["height"]/$imgInfo["height"]);
 96             }
 97             
 98             return $size;
 99         }
100         private function getInfo($name){
101             $date=getImageSize($this->path.$name);
102             
103             $imageInfo["width"]=$date[0];
104             $imageInfo["height"]=$date[1];
105             $imageInfo["type"]=$date[2];
106             
107             return $imageInfo; 
108         }
109         private function getImg($name,$imgInfo){
110             $srcPic=$this->path.$name;        //某路径下的图片
111             
112             switch($imgInfo["type"]){
113                 case "1":        //gif
114                         $img=imagecreatefromgif($srcPic);
115                         break;
116                 case "2":        //jpg
117                         $img=imagecreatefromjpeg($srcPic);
118                         break;
119                 case "3":        //png
120                         $img=imagecreatefrompng($srcPic);
121                         break;
122                 default:
123                         return false;
124             }
125             return $img;
126         }
127         
128         
129         /*    功能:为图片加水印
130         *    
131         *    参数$groundName:背景图片,即需要加水印的图片
132         *    参数$waterMark:水印图片
133         *    参数$waterPos:水印位置,10种状态
134         *        0随机位置
135         *            1顶端居左    2顶端居中    3顶端居右
136         *            4中部居左    5中部居中    6中部居右
137         *            7底部居左    8底部居中    9底部居右
138         *
139         *    参数$qz:是加水印后图片名称的前缀
140         *    返回值:处理后图片的名称
141         */
142         function waterMark($groundName,$waterName,$waterPos=0,$qz="wa_"){
143             if(file_exists($this->path.$groundName) && file_exists($this->path.$waterName)){
144                 $groundInfo = $this->getInfo($groundName);
145                 $waterInfo = $this->getInfo($waterName);
146                 //水印位置
147                 if(!$pos = $this->position($groundInfo,$waterInfo,$waterPos)){
148                     echo "水印不应该比背景图片小";
149                     return;
150                 }
151                 $groundImg = $this->getImg($groundName,$groundInfo);
152                 $waterImg = $this->getImg($waterName, $waterInfo);
153                 
154                 $groundImg = $this->copyImage($groundImg, $waterImg, $pos, $waterInfo);
155                 return $this->createNewImage($groundImg, $qz.$groundName, $groundInfo);
156                 
157             }else{
158                 echo "图片或水印不存在";
159                 return false;
160             }
161         }
162         
163         private function copyImage($groundImg, $waterImg, $pos, $waterInfo){
164             imagecopy($groundImg, $waterImg, $pos["posX"], $pos["posY"], 0, 0, $waterInfo["width"], $waterInfo["height"]);
165             
166             imagedestroy($waterImg);
167             
168             return $groundImg;
169         }
170         private function position($groundInfo,$waterInfo,$waterPos){
171             //需要背景比水印图片大
172             if(($groundInfo["width"] < $waterInfo["width"]) || ($groundInfo["height"] < $waterInfo["height"])){
173                 return false;
174             }
175             switch($waterPos){
176                 case 1:            //顶部居左
177                         $posX=0;
178                         $posY=0;
179                         break;
180                 case 2:            //顶部居中
181                         $posX=($groundInfo["width"]-$waterInfo["width"])/2;
182                         $posY=0;
183                         break;
184                 case 3:            //顶部居右
185                         $posX=($groundInfo["width"]-$waterInfo["width"]);
186                         $posY=0;
187                         break;
188                 case 4:            //中部居左
189                         $posX=0;
190                         $posY=($groundInfo["height"]-$waterInfo["height"])/2;
191                         break;
192                 case 5:            //中部居中
193                         $posX=($groundInfo["width"]-$waterInfo["width"])/2;
194                         $posY=($groundInfo["height"]-$waterInfo["height"])/2;
195                         break;
196                 case 6:            //中部居右
197                         $posX=($groundInfo["width"]-$waterInfo["width"]);
198                         $posY=($groundInfo["height"]-$waterInfo["height"])/2;
199                         break;
200                 case 7:            //底部居左
201                         $posX=0;
202                         $posY=($groundInfo["height"]-$waterInfo["height"]);
203                         break;
204                 case 8:            //底部居中
205                         $posX=($groundInfo["width"]-$waterInfo["width"])/2;
206                         $posY=($groundInfo["height"]-$waterInfo["height"]);
207                         break;
208                 case 9:            //底部居右
209                         $posX=($groundInfo["width"]-$waterInfo["width"]);
210                         $posY=($groundInfo["height"]-$waterInfo["height"]);
211                         break;
212                 case 0:            //随机位置
213                         $posX=rand(0,($groundInfo["width"]-$waterInfo["width"]));
214                         $posY=rand(0,($groundInfo["height"]-$waterInfo["height"]));
215                         break;
216             }
217             return array("posX"=>$posX, "posY"=>$posY);
218         }
219     }
220 ?>

 

文件上传类

  1 <?php
  2        /* 该用于文件上传
  3     * 有4个公有方法可以在对象外部调用:
  4     * __construct()构造方法用于初使化成员属性
  5     * uploadFile()方法用于上传文件
  6     * getNewFileName()方法用于获取上传成功后的文件名称
  7     * getErrorMsg()方法用于上传失败后获取错误提示信息
  8     * 其它属性和方法都被本类封装,不可以在对象外部调用
  9     */
 10     class FileUpload {    
 11         private $filepath;     // 上传文件的目的路径
 12         private $allowtype = array(\'jpg\',\'gif\',\'png\'); //充许上传文件的类型,使用小字母
 13         private $maxsize = 1000000;  //允许文件上传的最大长度1m
 14         private $israndname = true;   //是否随机重命名 false为不随机
 15         private $originName;     //源文件名
 16         private $tmpFileName;   //临时文件名
 17         private $fileType;     //文件类型(文件后缀)
 18         private $fileSize;     //文件大小
 19         private $newFileName;     //新文件名
 20         private $errorNum = 0; //错误号
 21         private $errorMess="";  //错误报告消息
 22         /* 构造方法:为成员属性初使化
 23          * 参数$options:为一个数组,数组下标为成员员属性名称字符串
 24          * 本类需要初使化的属性有 filepath, allowtype, maxsize,israndname四个属性,其中filepath为必须设置的属性
 25          * 使用的格式为 new FileUpload(array(\'filepath\'=>\'./uploads\', \'maxsize\'=>10000000)) 的格式
 26          */
 27         function __construct($options=array()) {
 28             foreach ($options as $key=>$val) {
 29                 $key=strtolower($key);   //在为成员属性设置值时,不区分大小写
 30                 if (!in_array($key,get_class_vars(get_class($this)))) 
 31                     continue;
 32                 $this->setOption($key, $val);
 33             }
 34         }
 35 
 36         /* 调用该方法上传文件
 37          * 参数: 上传文件的表单名称 例如:<input type="file" name="myfile"> 参数则为myfile
 38          * 返回值: 如果上传成功返回数字0,如果上传失败则返回小于0的数,如:-1、-2、-3、-4、-5中的一个 
 39          */
 40         
 41         function uploadFile($fileField) {
 42             $return=true;
 43             if(!$this->checkFilePath()) {//检查文件路径
 44                 $this->errorMess=$this->getError();
 45                 return false;
 46             }
 47             $name=$_FILES[$fileField][\'name\'];
 48             $tmp_name=$_FILES[$fileField][\'tmp_name\'];
 49             $size=$_FILES[$fileField][\'size\'];
 50             $error=$_FILES[$fileField][\'error\'];
 51 
 52         
 53         
 54             if(is_Array($name)){  //如果是多个文件上传则$file["name"]会是一个数组
 55                 $errors=array();
 56                 for($i = 0; $i < count($name); $i++){ 
 57                     if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i] )) {//设置文件信息
 58                         if(!$this->checkFileSize() || !$this->checkFileType()){
 59                             $errors[]=$this->getError();
处理recyclerview单击片段而不是持有者类

根据图片的url地址下载图片到本地保存代码片段

如何把视频片段做成动态图片

Android 中图可以用到的图片处理类 BitmapUtils

手机safari图片上传竖变横处理

CardView 不在披萨片段中显示图片