基于PHP服务端图片生成缩略图的方法详解
author:一佰互联 2019-04-29   click:155
复制代码 代码如下:
<?php
//定义缩略图片尺寸
$picSize = array(
              "100_100"=> 1,
              "200_100"=> 1
           );
$imagePath = "../image/";
function parseUrl($url){
   preg_match("/(?P<name>[wd]+)_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 为此文件。。