博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
缩略图的生成
阅读量:6078 次
发布时间:2019-06-20

本文共 16458 字,大约阅读时间需要 54 分钟。

1 //生成缩略图 2     public function wgetimg($topath, $w, $h, $url, $picname, $type) { 3         $sRealPath = realpath('./'); 4         $sSelfPath = $_SERVER['PHP_SELF']; 5         $sSelfPath = substr($sSelfPath, 0, strrpos($sSelfPath, '/')); 6         $sSelfPath = substr($sRealPath, 0, strlen($sRealPath) - strlen($sSelfPath)); 7          8         $topath = $sSelfPath.$topath; 9         include_once('./apps/index/Lib/Action/imgAction.class.php');10         $type = strtolower($type);11         if (!file_exists($topath . $picname . '.' . $type)) {12             //exec("wget -c -t 100 -T 60 -O ".$topath.$picname.'.'.$type." ".$url);13             exec("wget -c -t 3 -T 60 -O " . $topath . $picname . '.' . $type . " " . $url);14         }15         16         if (!file_exists($topath . '(' . $w . 'x' . $h . ')_' . $picname . '.' . $type) && file_exists($topath . $picname . '.' . $type)) {17             /* 生成图片 */18             $arrayName = array(19                     'path' => $topath . $picname . '.' . $type,20                     'name' => '(' . $w . 'x' . $h . ')_' . $picname,21                     'type' => $type,22                     'topath' => $topath,23                     'scale' => true,24                     'tow' => $w,25                     'toh' => $h,26                     'poi' => 1,27                     'strict' => false28             );29             $a = new imgAction($arrayName);30         }31         //return $arrayName['name'].$arrayName['type'];32     }

调用:

第一个参数:缩略图要存放的目录,后面两个参数是缩略图的大小。$img1:是要被缩略的原图地址;$picname是缩略图的名称,不含后缀。$type是图片的类型即后缀.

 

$this->wgetimg('/data/Uploads/ad/', 318, 395, $img1, $picname, $type);

 

 

imgAction.class.php:

1 
string 'teJkZsyiFzngfNDeKU.jpg' (length=22) 59 'name' => string 'aa' (length=2) 60 'type' => string 'jpg' (length=3) 61 'topath' => string 'D:\svn\tmp\test/' (length=16) 62 'fiexd' => boolean true 63 'tow' => int 160 64 'toh' => int 40 65 'poi' => int 1 66 'raww' => int 533 67 'rawh' => int 800 68 'rawtype' => string 'jpg' (length=3) 69 'rawext' => string 'jpg' (length=3) 70 'dirname' => string '.' (length=1) 71 'tmpimg' => resource(4, gd) 72 'time' => int 1358504732 73 'w' => float 160 74 'h' => float 240.15009380863 75 'msg' => int 1 76 77 PS: 按比例缩小只需写宽或高,缩放时按大的尺寸缩放 如 宽 0 高 10 则按高度10缩放 78 79 */ 80 81 class imgAction{ 82 public function __construct($imgInfo){ 83 !is_array($imgInfo)? exit('not array'):''; 84 85 $this->imgInfo = $imgInfo; 86 if (!$this->exists($this->imgInfo['path'])){ 87 return false; 88 } 89 90 $imagesize = $this->getimagesize($this->imgInfo['path'],$this->imgInfo['strict']); 91 if (!$imagesize){ 92 return false; 93 } 94 $this->imgInfo['raww'] = $imagesize['0']; 95 $this->imgInfo['rawh'] = $imagesize['1']; 96 $this->imgInfo['rawtype'] = $imagesize['type']; 97 $this->imgInfo['rawext'] = $imagesize['extension']; 98 $this->imgInfo['name'] = isset($imgInfo['name']) ? $imgInfo['name'] : $imagesize['filename']; 99 $this->imgInfo['type'] = isset($imgInfo['type']) ? $imgInfo['type'] : $imagesize['type']; 100 $this->imgInfo['dirname'] = $imagesize['dirname'];101 $this->imgInfo['tmpimg'] = $imagesize['tmpimg'];102 $this->pyresizepic();103 }104 /*105 图片处理缩略106 */107 private function pyresizepic(){108 $ratio = $this->ratio($this->imgInfo);109 $this->imgInfo['w'] = $ratio['w'];110 $this->imgInfo['h'] = $ratio['h'];111 if ($this->imgInfo['scale']){112 $this->fiexd($ratio);113 }else{114 $this->scale($ratio);115 }116 117 }118 /*固定大小的缩放*/119 private function fiexd($ratio){120 $newimg = imagecreatetruecolor($this->imgInfo['tow'],$this->imgInfo['toh']);121 imagecopyresampled($newimg,$this->imgInfo['tmpimg'], 0, 0, $ratio['x'], $ratio['y'], $ratio['w'],$ratio['h'], $this->imgInfo['raww'], $this->imgInfo['rawh']);122 $this->printpic($newimg);123 }124 /*按比例的缩放*/125 private function scale($ratio){126 $newimg = imagecreatetruecolor($ratio['w'],$ratio['h']);127 imagecopyresampled($newimg,$this->imgInfo['tmpimg'], 0, 0, 0, 0, $ratio['w'],$ratio['h'], $this->imgInfo['raww'], $this->imgInfo['rawh']);128 $this->printpic($newimg);129 }130 /*将bmp改成jpg*/131 private function bmp($im,$path,$w,$h){132 $newimg = imagecreatetruecolor($w,$h);133 imagecopyresampled($newimg,$im, 0, 0, 0, 0, $w,$h, $w,$h);134 imagejpeg($newimg,$path,100);135 }136 137 /*生成图片*/138 private function printpic($newimg){139 if (!$this->exists($this->imgInfo['topath'])){140 if (!mkdir($this->imgInfo['topath'],777)){141 $this->text($this->imgInfo['topath']);142 }143 }144 ImageInterlace($newimg,1);145 switch ($this->imgInfo['type']) {146 case 'gif':147 imagegif($newimg,$this->imgInfo['topath'].$this->imgInfo['name'].'.'.$this->imgInfo['type']);148 break;149 case 'jpg':150 case 'jpeg':151 imagejpeg($newimg,$this->imgInfo['topath'].$this->imgInfo['name'].'.'.$this->imgInfo['type']);152 break;153 case 'png':154 imagepng($newimg,$this->imgInfo['topath'].$this->imgInfo['name'].'.'.$this->imgInfo['type']);155 break;156 case 'bmp':157 imagejpeg($newimg,$this->imgInfo['topath'].$this->imgInfo['name'].'.'.$this->imgInfo['type']);158 break;159 default:160 $this->text($this->imgInfo['topath']);161 break;162 }163 $this->imgInfo['time'] = time();164 $this->imgInfo['msg'] = 1 ;165 //return $this->imgInfo;166 //$this->text($this->imgInfo);167 }168 169 /*计算缩放比例*/170 private function ratio(){171 $ratio = ($this->imgInfo['raww'] >= $this->imgInfo['rawh']) ? $this->imgInfo['toh']/$this->imgInfo['rawh'] : $this->imgInfo['tow']/$this->imgInfo['raww'];172 173 $p = 0.3132530120481928; //坐标偏移,截取中间时,某些尺寸会出错,需设置便宜值174 175 $scrWH['w'] = $this->imgInfo['raww']*$ratio;176 $scrWH['h'] = $this->imgInfo['rawh']*$ratio;177 178 if ($scrWH['w'] < $this->imgInfo['tow'] || $scrWH['h'] < $this->imgInfo['toh']){179 $ratio = ($this->imgInfo['raww'] >= $this->imgInfo['rawh']) ? $this->imgInfo['tow']/$this->imgInfo['raww'] : $this->imgInfo['toh']/$this->imgInfo['rawh'];180 if ($scrWH['w'] < $this->imgInfo['tow'] ){181 $scrWH['w'] = $this->imgInfo['tow'];182 $scrWH['h'] = $this->imgInfo['rawh']*$ratio;183 }184 if ($scrWH['w'] < $this->imgInfo['tow'] ){185 $scrWH['w'] = $this->imgInfo['raww']*$ratio;186 $scrWH['h'] = $this->imgInfo['rawh'];187 }188 }189 190 191 if ($this->imgInfo['poi'] == 1){192 193 $scrWH['x'] = ($scrWH['w'] > $this->imgInfo['tow']) ? ($scrWH['w'] - $this->imgInfo['tow'])/2 : 0;194 $scrWH['y'] = ($scrWH['h'] > $this->imgInfo['toh']) ? ($scrWH['h'] - $this->imgInfo['toh'])/2 : 0;195 $scrWH['x'] = $scrWH['x']*$p ;196 $scrWH['y'] = $scrWH['y']*$p ;197 198 }elseif ($this->imgInfo['poi'] == 2){199 $scrWH['x']=0;200 $scrWH['y'] = ($scrWH['h'] > $this->imgInfo['toh']) ?$scrWH['h']-$this->imgInfo['toh'] : 0;201 }else{202 $scrWH['x']=0;203 $scrWH['y']=0;204 }205 return $scrWH;206 }207 /*208 1 为 GIF 格式、 2 为 JPEG/JPG 格式、3 为 PNG209 */210 private function getimagesize($string,$strict){211 $_getimagesize = getimagesize($string);212 $inarray = array('jpg','png','gif','bmp');213 switch ($_getimagesize[2]) {214 case 1:215 $type = 'gif';216 break;217 case 2:218 $type = 'jpg';219 break;220 case 3:221 $type = 'png';222 break;223 case 6:224 $type = 'bmp';225 break;226 default:227 $this->text($_getimagesize[2]);228 break;229 }230 switch ($_getimagesize['mime']) {231 case 'image/png':232 $mine = 'png';233 break;234 case 'image/jpeg':235 $mine = 'jpg';236 break;237 case 'image/gif':238 $mine = 'gif';239 break;240 case 'image/x-ms-bmp':241 $mine = 'bmp';242 break;243 default:244 $this->text($_getimagesize['mime']);245 break;246 }247 248 249 $pathinfo = $this->pathinfo($string);250 251 252 253 if ($mine == 'bmp'){ 254 rename (dirname(__FILE__).'/'.$pathinfo['dirname'].'/'.$pathinfo['basename'],dirname(__FILE__).'/'.$pathinfo['dirname'].'/'.$pathinfo['filename'].'.'.$mine) ;255 $string = $pathinfo['dirname'].'/'.$pathinfo['filename'].'.'.$mine;256 $pathinfo = $this->pathinfo($string);257 }258 259 if ($strict){260 /*严格校验*/261 $type = $type != $mine ? false :$type;262 $type = $type != $pathinfo['extension'] ? false :$type;263 $type = $mine != $pathinfo['extension'] ? false :$type;264 265 if (!$type){266 return false;267 }268 269 }else{270 /*宽松较验*/271 if (!in_array($type,$inarray) || !in_array($mine,$inarray) || !in_array($pathinfo['extension'],$inarray)){272 return false;273 }274 }275 276 $_getimagesize['type'] = $pathinfo['extension'];277 $_getimagesize['dirname'] = $pathinfo['dirname'];278 $_getimagesize['filename'] = $pathinfo['filename'];279 $_getimagesize['extension'] = $pathinfo['extension'];280 281 switch ($type) {282 case 'gif':283 $_getimagesize['tmpimg'] = imagecreatefromgif($string);284 break;285 case 'jpg':286 $_getimagesize['tmpimg'] = imagecreatefromjpeg($string);287 break;288 case 'png':289 $_getimagesize['tmpimg'] = imagecreatefrompng($string);290 break;291 case 'bmp':292 $_getimagesize['tmpimg'] = $this->imagecreatefrombmp($string);293 break;294 default:295 $this->text($type);296 break;297 }298 if ($type == 'bmp'){299 imagejpeg($_getimagesize['tmpimg'], $_getimagesize['dirname'].'/'.$_getimagesize['filename'].'.jpg');300 unlink($_getimagesize['dirname'].'/'.$_getimagesize['filename'].'.'.$_getimagesize['extension']);301 $_getimagesize['extension'] = 'jpg';302 $_getimagesize['tmpimg'] = imagecreatefromjpeg($_getimagesize['dirname'].'/'.$_getimagesize['filename'].'.'.$_getimagesize['extension']);303 } 304 return $_getimagesize;305 }306 /*307 文件名字信息308 */309 private function pathinfo($string)310 {311 $extend = pathinfo($string);312 $extend['extension'] = strtolower($extend['extension']);313 if ($extend['extension'] == 'jpeg') $extend['extension'] = 'jpg';314 return $extend;315 }316 /*317 文件存在318 */319 private function exists($string){320 if (!file_exists($string)){321 return false;322 }323 return true;324 }325 /*test 用,可以保存未知文件的LOG信息*/326 private function text($str){327 return false;328 //var_dump($str);329 //exit;330 }331 private function imagecreatefrombmp($string){332 $tmp_name = tempnam("tmp", "GD");333 if($this->ConvertBMP2GD($string, $tmp_name)) {334 $img = imagecreatefromgd($tmp_name);335 unlink($tmp_name);336 return $img;337 }338 return false;339 }340 /* 处理PNG 图片*/341 private function ConvertBMP2GD($src, $dest = false) {342 if(!($src_f = fopen($src, "rb"))) {343 return false;344 }345 if(!($dest_f = fopen($dest, "wb"))) {346 return false;347 }348 $header = unpack("vtype/Vsize/v2reserved/Voffset", fread($src_f, 14));349 $info = unpack("Vsize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vncolor/Vimportant", fread($src_f, 40));350 extract($info);351 extract($header);352 if($type != 0x4D42) { // signature "BM"353 return false;354 }355 $palette_size = $offset - 54;356 $ncolor = $palette_size / 4;357 $gd_header = "";358 // true-color vs. palette359 $gd_header .= ($palette_size == 0) ? "\xFF\xFE" : "\xFF\xFF";360 $gd_header .= pack("n2", $width, $height);361 $gd_header .= ($palette_size == 0) ? "\x01" : "\x00";362 if($palette_size) {363 $gd_header .= pack("n", $ncolor);364 }365 // no transparency366 $gd_header .= "\xFF\xFF\xFF\xFF";367 fwrite($dest_f, $gd_header);368 if($palette_size) {369 $palette = fread($src_f, $palette_size);370 $gd_palette = "";371 $j = 0;372 while($j < $palette_size) {373 $b = $palette{$j++};374 $g = $palette{$j++};375 $r = $palette{$j++};376 $a = $palette{$j++};377 $gd_palette .= "$r$g$b$a";378 }379 $gd_palette .= str_repeat("\x00\x00\x00\x00", 256 - $ncolor);380 fwrite($dest_f, $gd_palette);381 }382 $scan_line_size = (($bits * $width) + 7) >> 3;383 $scan_line_align = ($scan_line_size & 0x03) ? 4 - ($scan_line_size & 0x03) : 0;384 for($i = 0, $l = $height - 1; $i < $height; $i++, $l--) {385 // BMP stores scan lines starting from bottom386 fseek($src_f, $offset + (($scan_line_size + $scan_line_align) * $l));387 $scan_line = fread($src_f, $scan_line_size);388 if($bits == 24) {389 $gd_scan_line = "";390 $j = 0;391 while($j < $scan_line_size) {392 $b = $scan_line{$j++};393 $g = $scan_line{$j++};394 $r = $scan_line{$j++};395 $gd_scan_line .= "\x00$r$g$b";396 }397 }398 else if($bits == 8) {399 $gd_scan_line = $scan_line;400 }401 else if($bits == 4) {402 $gd_scan_line = "";403 $j = 0;404 while($j < $scan_line_size) {405 $byte = ord($scan_line{$j++});406 $p1 = chr($byte >> 4);407 $p2 = chr($byte & 0x0F);408 $gd_scan_line .= "$p1$p2";409 }410 $gd_scan_line = substr($gd_scan_line, 0, $width);411 }412 else if($bits == 1) {413 $gd_scan_line = "";414 $j = 0;415 while($j < $scan_line_size) {416 $byte = ord($scan_line{$j++});417 $p1 = chr((int) (($byte & 0x80) != 0));418 $p2 = chr((int) (($byte & 0x40) != 0));419 $p3 = chr((int) (($byte & 0x20) != 0));420 $p4 = chr((int) (($byte & 0x10) != 0));421 $p5 = chr((int) (($byte & 0x08) != 0));422 $p6 = chr((int) (($byte & 0x04) != 0));423 $p7 = chr((int) (($byte & 0x02) != 0));424 $p8 = chr((int) (($byte & 0x01) != 0));425 $gd_scan_line .= "$p1$p2$p3$p4$p5$p6$p7$p8";426 }427 $gd_scan_line = substr($gd_scan_line, 0, $width);428 }429 fwrite($dest_f, $gd_scan_line);430 }431 fclose($src_f);432 fclose($dest_f);433 return true;434 }435 }436 /*437 $arrayName = array(438 'path' => '0a9eaff4-b692-49df-95ba-e32c108be4d7.jpg',439 'name' => 'aa',440 'type' => 'jpg',441 'topath' => dirname(__FILE__).'/',442 'scale' => true,443 'tow' => 140,444 'toh' => 140,445 'poi' => 1,446 'strict' => false447 );448 $a = new imgAction($arrayName);449 */450 ?>

 

转载于:https://www.cnblogs.com/xingmeng/p/3412097.html

你可能感兴趣的文章
安装MySQLdb-python时无法找到-lprobes_mysql处理一则
查看>>
对计算机模拟人脑的一个小想法
查看>>
CI分页器pagination的原理及实现
查看>>
The Rox Java NIO Tutorial
查看>>
如何选择婴幼儿奶粉?
查看>>
MySQL global Log
查看>>
BZOJ3564 : [SHOI2014]信号增幅仪
查看>>
发布流程考虑
查看>>
Openvswitch手册(1): 架构,SSL, Manager, Bridge
查看>>
EditText中文文档
查看>>
文本比较算法:Needleman/Wunsch算法
查看>>
c++文件读写操作
查看>>
理解Spring的Bean工厂
查看>>
excel中的数据粘贴不全到plsql中,excel 粘贴后空白,Excel复制粘贴内容不全
查看>>
设计指南剧情战斗(欢迎探讨)
查看>>
1、IOS开发--iPad之仿制QQ空间(登录界面搭建+登录逻辑实现)
查看>>
UIImagePickerController从拍照、图库、相册获取图片
查看>>
LeetCode-95. Unique Binary Search Trees II
查看>>
mysql存储过程procedure
查看>>
Mybatis学习——一对一关联表查询
查看>>