基于PHP服务端图片生成缩略图的方法详解

复制代码 代码如下:

  <?php

  //定义缩略图片尺寸

  $picSize = array(

  '100_100'=> 1,

  '200_100'=> 1

  );

  $imagePath = "../image/";

  function parseUrl($url){

  preg_match("/(?P<name>[\w\d]+)_w(?P<width>\d+)_h(?P<height>\d+)\.(?P<ext>\w+)/",$url,$match);

  return $match;

  }

  $urlArr = explode("/",$_SERVER['REQUEST_URI']);

  $imgName = $urlArr[count($urlArr)-1];

  $picInfo = parseUrl($imgName);

  //错误尺寸

  if(empty($picInfo['width']) || empty($picInfo['height']) ||

  !array_key_exists($picInfo['width'].'_'.$picInfo['height'],$picSize)) die('不存在该尺寸图片');

  $originalPic = $imagePath.$picInfo['name'].'/'.$picInfo['name'].'.'.$picInfo['ext'];

  //原始图不存在

  if(!file_exists($originalPic)) die("图片不存在!");

  /**

  *等比例压缩图片

   */

  switch($picInfo['ext']){

  case 'jpg':

  $orgImg = ImageCreateFromJpeg($originalPic);

  break;

  default:

  break;

  }

  $owidth  =  ImageSX($orgImg); //原始尺寸

  $oheight =  ImageSY($orgImg);

  $tW = $picInfo['width'];

  $tH = $picInfo['height'];

  //获取缩略图尺寸

  if($owidth/$oheight > $tW/$tH){

  $tH = intval($tW * $oheight/$owidth);

  }else{

  $tW = intval($tH * $owidth/$oheight);

  }

  //生成背景图

  $new_img = ImageCreateTrueColor($picInfo['width'], $picInfo['height']);

  $bgColor = imagecolorallocate($new_img,255,255,255);

  if (!@imagefilledrectangle($new_img, 0, 0, $picInfo['width']-1, $picInfo['height']-1, $bgColor)) {

  echo "无法创建背景图";  //@todo记录日志

  exit(0);

  }

  if (!@imagecopyresampled($new_img, $orgImg, ($picInfo['width']-$tW)/2, ($picInfo['height']-$tH)/2, 0, 0, $tW, $tH, $owidth, $oheight)) {

  echo "生成图片失败";

  exit(0);

  }

  //生成图片

  ob_start();

  imagejpeg($new_img);

  $_newImg = ob_get_contents();

  ob_end_clean();

  file_put_contents($imagePath.$picInfo['name']."/".$imgName, $_newImg);

  header("Content-type:image/jpeg; charset=utf-8");

  imagejpeg($new_img);

  ?>

  使用时候绑定apache conf 的 documentError 404 的handler 为此文件。。