缩略图的生成

 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' => false

28             );

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 <?php

  2 /*

  3 图片处理类

  4 输入参数    $imgInfo array

  5                 ['raww'] int 原始图片宽度

  6                 ['rawh'] int 原始图片高度

  7                 ['rawtype'] string 图片类型

  8                 ['rawext'] 图片后缀

  9                 ['rsize'] 原图大小

 10                 ['dirname'] 图片与后缀的分割符

 11                 ['tmpimg'] 初始化后的图片

 12 

 13                 *['scale'] = true/flase 

 14                 true 设置固定尺寸,不够大放大,太大缩小

 15                 flase 按比例缩放

 16                 true 按框高等比缩放

 17                 ['tow']  int 缩放的宽 px

 18                 ['toh']  int 缩放的高 px

 19 

 20                 ['poi'] int

 21                 0 坐标0 截取保留上部分

 22                 1 截取保留中间部分

 23                 2 截取保留下面部分

 24 

 25                 ['name'] string 空使用原来的名字

 26                 ['type'] = string 空保留原来的图片类型

 27 

 28                 *['path'] string 图片来路

 29                 *['topath'] sring 保存的路径

 30                 ['strict'] 是否严格较验图片类型 , 类型与后缀需相同 默认为 true

 31 

 32                 ['show'] = true/false 

 33                 true 直接输出图片 

 34 

 35                 ['quality'] int 60-100 图片质量

 36 

 37                 ['watermark'] array

 38                     ---['type'] text 文字水印 img 图片水印

 39                     ---['path'] string 来路

 40                     ---['forcing'] = true/false

 41                        true 强制水印,不管图片高宽

 42                     ---['poi']  int 水印位置,从左到右

 43                               0 1 2

 44                               3 4 5

 45                               6 7 8

 46                               9    9为随机

 47 

 48                 ['goimg'] array 内容生成图片

 49                     ---['content'] string 内容

 50                     ---['font'] string 字体

 51                     ---['size'] int 字号

 52                     ---['bold'] = true/false 

 53                     true 加粗

 54                 ['msg'] = true/flase

 55                 true 只返回成功失败信息

 56 

 57 输出参数     imgInfo array 

 58                   'path' => 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 为 PNG

209     */

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. palette

359  $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 transparency

366  $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 bottom

386   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' => false

447      );

448 $a = new imgAction($arrayName);

449 */

450  ?>

 

你可能感兴趣的:(缩略图)