龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

php 基于GD库的缩略图图 生成类

时间:2014-08-12 03:26来源:网络整理 作者:网络 点击:
分享到:
基于GD库的缩略图图 生成类 [代码片段(136行)]
<?php
 /**
  * 图片缩略类  
  */

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);         
        }

}

?>
//该片段来自于http://outofmemory.cn
精彩图集

赞助商链接