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单击片段而不是持有者类