基于PHP服务端图片生成缩略图的方法详解
分类:威尼斯手机平台

复制代码 代码如下:

<?php / * 图片缩略类 * @author foyon * */class ImgThumb{ / * 生成的高低完全切合供给,但是会截图 @param unknown_type $src_file @param unknown_type $dst_file * @param unknown_type $new_width * @param unknown_type $new_height / function ImageResize($src_file, $dst_file , $new_width , $new_height) { $new_width= intval($new_width); $new_height=intval($new_height); if($new_width <1 || $new_height <1) { echo "params width or height error !"; exit(); } $src_img=imagecreatefromstring($src_file); $w=imagesx($src_img); $h=imagesy($src_img); $ratio_w=1.0 $new_width / $w; $ratio_h=1.0 $new_height / $h; $ratio=1.0; // 生成的图像的高宽比原本的都小,或都大 ,原则是 取大比例放大,取大比重裁减(缩短的百分比就十分的小了) if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)) { if($ratio_w < $ratio_h) { $ratio = $ratio_h ; // 情形后生可畏,宽度的百分比比中度方向的小,根据低度的比重规范来裁剪或放大 }else { $ratio = $ratio_w ; } // 定义四个西路的一时图像,该图像的宽高比 恰恰满足目的必要 $inter_w=(int)($new_width / $ratio); $inter_h=(int)($new_height / $ratio); $inter_img=imagecreatetruecolor($inter_w , $inter_h); //var_dump($inter_img); imagecopy($inter_img, $src_img, 0,0,0,0,$inter_w,$inter_h卡塔尔; // 生成三个以最大边长度为大小的是指标图像$ratio比例的一时半刻图像 // 定义八个新的图像 $new_img=imagecreatetruecolor($new_width,$new_height); //var_dump($new_img);exit(); imagecopyresampled($new_img,$inter_img,0,0,0,0,$n ew_width,$new_height,$inter_威尼斯手机平台,w,$inter_h); imagejpeg($new_img, $dst_file,100); ob_clean(); header("Content-type: image/jpeg"); Imagejpeg($new_img卡塔尔; } // end if 1 // 2 对象图像 的叁个边大于原图,三个边小于原图 ,先放大平普图像,然后裁剪 // =if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) ) else{ $ratio=$ratio_h>$ratio_w? $ratio_h : $ratio_w; //取比例大的特别值 // 定义壹在这之中级的大图像,该图像的高或宽和指标图像相等,然后对原图放大 $inter_w=(int)($w $ratio); $inter_h=(int)($h * $ratio); $inter_img=imagecreatetruecolor($inter_w , $inter_h卡塔尔; //将原图缩放比例后裁剪 imagecopyresampled($inter_img,$src_img,0,0,0,0,$inter_w,$inter_h,$w,$h卡塔尔; // 定义一个新的图像 $new_img=imagecreatetruecolor($new_width,$new_height); imagecopy($new_img, $inter_img, 0,0,0,0,$new_width,$new_height); imagejpeg($new_img, $dst_file,100); ob_clean(); header("Content-type: image/jpeg"); Imagejpeg($new_img); } } / * 图片管理函数 * @param unknown_type $img 传入的原图像流(MONGO二进制) * @param unknown_type $dst_file 转变后的图像存款和储蓄路线 * @param unknown_type $toW 生成的上涨的幅度 * @param unknown_type $toH 生成的中度 / public function ImageChange($img, $dst_file, $toW='', $toH=''){ $im = imagecreatefromstring($img); $srcW=ImageSX($im); $srcH=ImageSY($im); if(!$toW){ $toW = $srcW; } if(!$toHState of Qatar{ $toH = $srcH; } $toWH=$toW/$toH; //生成宽高比 $srcWH=$srcW/$srcH; //原图宽高比 if($toWH <= $srcWHState of Qatar{ $ftoW=$toW; $ftoH=$ftoW($srcH/$srcW); }else{ $ftoH=$toH; $ftoW=$ftoH*($srcW/$srcH); } if(function_exists("imagecreatetruecolor")){ @$ni = ImageCreateTrueColor($ftoW,$ftoH); imagealphablending($ni,false); imagesavealpha($ni,true); if($ni){ ImageCopyResampled($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH); }else{ $ni=ImageCreate($ftoW,$ftoH); ImageCopyResized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH); } }else{ $ni=ImageCreate($ftoW,$ftoH); ImageCopyResized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH); } imagejpeg($ni, $dst_file,100); ob_clean(); header("Content-type: image/jpeg"); imagejpeg($ni); } }?>

//定义缩略图片尺寸 $picSize = array(
              '100_100'=> 1,
              '200_100'=> 1
           );
$imagePath = "../image/";
function parseUrl($url){
   preg_match("/(?P[wd]+)_w(?Pd+)_h(?Pd+).(?Pw+)/",$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卡塔尔国State of Qatardie('官样文章该尺寸图片'卡塔尔国;
$originalPic = $imagePath.$picInfo['name'].'/'.$picInfo['name'].'.'.$picInfo['ext'];
//原始图不设有 if(!file_exists($originalPicState of Qatar卡塔尔(قطر‎ 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);
?>

imgthumb.class.php ~ 4KB    下载(2)

接受时候绑定apache conf 的 documentError 404 的handler 为此文件。。

<?php
 /**
  * 图片缩略类
  * @author foyon
  *
  */

class ImgThumb{

        /**
         * 生成的大小完全符合要求,但是会截图
         * @param unknown_type $src_file
         * @param unknown_type $dst_file
         * @param unknown_type $new_width
         * @param unknown_type $new_height
         */
        function ImageResize($src_file, $dst_file , $new_width , $new_height) {
            $new_width= intval($new_width);
            $new_height=intval($new_height);

            if($new_width <1 || $new_height <1) {
                echo "params width or height error !";
                exit();
            }

            $src_img=imagecreatefromstring($src_file);
            $w=imagesx($src_img);
            $h=imagesy($src_img);
            $ratio_w=1.0 * $new_width / $w;
            $ratio_h=1.0 * $new_height / $h;
            $ratio=1.0;
            // 生成的图像的高宽比原来的都小,或都大 ,原则是 取大比例放大,取大比例缩小(缩小的比例就比较小了)
            if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)) {
                if($ratio_w < $ratio_h) {
                    $ratio = $ratio_h ; // 情况一,宽度的比例比高度方向的小,按照高度的比例标准来裁剪或放大
                }else {
                    $ratio = $ratio_w ;
                }
                // 定义一个中间的临时图像,该图像的宽高比 正好满足目标要求
                $inter_w=(int)($new_width / $ratio);
                $inter_h=(int)($new_height / $ratio);
                $inter_img=imagecreatetruecolor($inter_w , $inter_h);
                //var_dump($inter_img);
                imagecopy($inter_img, $src_img, 0,0,0,0,$inter_w,$inter_h);
                // 生成一个以最大边长度为大小的是目标图像$ratio比例的临时图像
                // 定义一个新的图像
                $new_img=imagecreatetruecolor($new_width,$new_height);
                //var_dump($new_img);exit();
                imagecopyresampled($new_img,$inter_img,0,0,0,0,$new_width,$new_height,$inter_w,$inter_h);
                imagejpeg($new_img, $dst_file,100);
                ob_clean();
                header("Content-type: image/jpeg"); 

                Imagejpeg($new_img);

            } // end if 1
            // 2 目标图像 的一个边大于原图,一个边小于原图 ,先放大平普图像,然后裁剪
            // =if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) )
            else{
                $ratio=$ratio_h>$ratio_w? $ratio_h : $ratio_w; //取比例大的那个值
                // 定义一个中间的大图像,该图像的高或宽和目标图像相等,然后对原图放大
                $inter_w=(int)($w * $ratio);
                $inter_h=(int)($h * $ratio);
                $inter_img=imagecreatetruecolor($inter_w , $inter_h);
                //将原图缩放比例后裁剪
                imagecopyresampled($inter_img,$src_img,0,0,0,0,$inter_w,$inter_h,$w,$h);
                // 定义一个新的图像
                $new_img=imagecreatetruecolor($new_width,$new_height);
                imagecopy($new_img, $inter_img, 0,0,0,0,$new_width,$new_height);
                imagejpeg($new_img, $dst_file,100);
                ob_clean();
                header("Content-type: image/jpeg");

                Imagejpeg($new_img);
            }
        }

        /**
         * 图片处理函数
         * @param unknown_type $img 传入的原图像流(MONGO二进制)
         * @param unknown_type $dst_file 转换后的图像存储路径
         * @param unknown_type $toW 生成的宽度
         * @param unknown_type $toH 生成的高度
         */
        public function ImageChange($img, $dst_file, $toW='', $toH=''){

            $im = imagecreatefromstring($img);
            $srcW=ImageSX($im);
            $srcH=ImageSY($im);

            if(!$toW){
                $toW = $srcW;
            }

            if(!$toH){
                $toH = $srcH;
            }

            $toWH=$toW/$toH; //生成宽高比
            $srcWH=$srcW/$srcH; //原图宽高比

            if($toWH <= $srcWH){
                $ftoW=$toW;
                $ftoH=$ftoW*($srcH/$srcW);
            }else{
                $ftoH=$toH;
                $ftoW=$ftoH*($srcW/$srcH);
            }

            if(function_exists("imagecreatetruecolor")){
                @$ni = ImageCreateTrueColor($ftoW,$ftoH);
                imagealphablending($ni,false);
                imagesavealpha($ni,true);
                if($ni){ 
                    ImageCopyResampled($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
                }else{
                    $ni=ImageCreate($ftoW,$ftoH);
                    ImageCopyResized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
                }

            }else{
                $ni=ImageCreate($ftoW,$ftoH);
                ImageCopyResized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
            }

            imagejpeg($ni, $dst_file,100);
            ob_clean();         
            header("Content-type: image/jpeg");         
            imagejpeg($ni);         
        }

}

?>

本文由威尼斯在线注册平台发布于威尼斯手机平台,转载请注明出处:基于PHP服务端图片生成缩略图的方法详解

上一篇:具体实现代码如下 下一篇:内需在意php获取路线用的是realpath,//与access连接要用到com接口了
猜你喜欢
热门排行
精彩图文