各位师傅大侠们好,小弟最近想做一个类似于美食图片分享的网站。现在碰到一个问题,就是对用户上传的图片进行压缩、按照不同的尺寸进行裁剪。按照用户的习惯,肯定是单个文件大,文件多。   因为之前没有做过类似的功能,所以无处下手。个人觉的不可能仅仅用PHP的代码对图像处理就能完成的,不知道有没有类似的第三方插件能解决这个问题。或者其他的解决方案!  在这里谢谢大家了!

解决方案 »

  1.   

    //图片压缩并另存函数//示例://if(!scal_pic('pic.jpg','new_pic.jpg')){ die('您上传的图片格式存在问题!'); //然后再删除掉图片文件 }
    function scal_pic($file_name,$file_new){
            //验证参数
            if(!is_string($file_name) || !is_string($file_new)){
                    return false;
            }
            //获取图片信息
            $pic_scal_arr = @getimagesize($file_name);
            if(!$pic_scal_arr){
                    return false;
            }
            //获取图象标识符
            $pic_creat = '';
            switch($pic_scal_arr['mime']){
                    case 'image/jpeg':
                            $pic_creat = @imagecreatefromjpeg($file_name);
                            break;
                    case 'image/gif':
                            $pic_creat = @imagecreatefromgif($file_name);
                            break;
                    case 'image/png':
                            $pic_creat = @imagecreatefrompng($file_name);
                            break;
                    case 'image/wbmp':
                            $pic_creat = @imagecreatefromwbmp($file_name);
                            break;
                    default:
                            return false;
                            break;
            }
            if(!$pic_creat){
                    return false;
            }
            //判断/计算压缩大小
            $max_width = 111;//最大宽度,象素,高度不限制
            $min_width = 15;
            $min_heigth = 20;
            if($pic_scal_arr[0]<$min_width || $pic_scal_arr[1]<$min_heigth){
                    return false;
            }
            $re_scal = 0;
            if($pic_scal_arr[0]>$max_width){
                    $re_scal = ($max_width / $pic_scal_arr[0]);
            }
            $re_width = round($pic_scal_arr[0] * $re_scal);
            $re_height = round($pic_scal_arr[1] * $re_scal);
            //创建空图象
            $new_pic = @imagecreatetruecolor($re_width,$re_height);
            if(!$new_pic){
                    return false;
            }
            //复制图象
            if(!@imagecopyresampled($new_pic,$pic_creat,0,0,0,0,$re_width,$re_height,$pic_scal_arr[0],$pic_scal_arr[1])){
                    return false;
            }
            //输出文件
            $out_file = '';
            switch($pic_scal_arr['mime']){
                    case 'image/jpeg':
                            $out_file = @imagejpeg($new_pic,$file_new);
                            break;
                    case 'image/jpg':
                            $out_file = @imagejpeg($new_pic,$file_new);
                            break;
                    case 'image/gif':
                            $out_file = @imagegif($new_pic,$file_new);
                            break;
                    case 'image/bmp':
                            $out_file = @imagebmp($new_pic,$file_new);
                            break;
                    default:
                            return false;
                            break;
            }
            if($out_file){
                    return true;
            }else{
                    return false;
            }}以前弄的  希望对你有帮助
      

  2.   

    我知道的,但是剪裁的尺寸,剪裁图片哪一部分是不是用户说的算?压缩剪裁后台php的gd2库函数都有你所需要的操作,其实这个不是难点,我觉得难点是如何让用户选择他所想要剪裁的位置和大小。你查一下gd库gd2库就知道了,很好调用的操作函数。
      

  3.   

    这个嘛,还是前台flash裁剪吧
    如果非要在服务器上面处理大量图片的话,用ImageMagick吧,占用资源比较少
      

  4.   

    可以用flash,也可以自动裁剪中间的一部分
      

  5.   


    压缩imagejpeg时更改质量。0_0剪裁用imagecopyresampled。
      

  6.   

    imagemagick
      

  7.   

    这个最好在前台使用js  或者是flash 来制作可以减少服务器的负载量
      

  8.   

    我自己写的自动生成缩略图的程序希望对你有用
    /**
     * 获得图像的缩略图
     * @name get_minImg_class.php
     * 
     *@调用方法$minImg=new getMinImg('文件名--要在服务器上',$thum);$thum为数组有$thum   ['height'],$thum['width']
     *$minImg->getAndSaveImg()
     **/
    class getMinImg{
        public    $imgSize=array();//存储img尺寸数组$imgSize['width'],$imgSize['height']
        public  $thum=array();//缩略图数组$thum['width'],$thum['height']
        public  $newImgSize=array();//生成新图片的大小$newImgSize['width'],$newImgSize['height']
        private   $imgfunc;//调用的图片函数名
        private $handle;//文件句柄
        public  $filename;//文件名
        public  $imgInfo=array();//文件信息$imgInfo[0]代表文件路径及名称(无后缀),$imgInfo[1]代表文件类型
        private  $newHandle;//新的文件句柄
        
        function __construct($filename,$thum=array('width'=>150,'height'=>100)){
            $this->filename=$filename;
            if(!(boolean)$this->filename){ return false;}
            $this->thum=$thum;
            $this->getImgType();
            $this->getHandle();
            $this->getImgSize();
            $this->getNewImgSize();
            }
        private  function getHandle(){//获得文件句柄
            switch ($this->imgInfo[1]) {
                case 'jpg':
                    $this->handle=imagecreatefromjpeg($this->filename);
                    $this->imgfunc="imagejpeg";
                    break;
                case 'jpeg':
                    $this->handle=imagecreatefromjpeg($this->filename);
                    $this->imgfunc="imagejpeg";
                    break;    
                case 'png':
                    $this->handle=imagecreatefrompng($this->filename);
                    $this->imgfunc="imagepng";
                    break;    
                case 'gif':
                    $this->handle=imagecreatefromgif($this->filename);
                    $this->imgfunc="imagegif";
                    break;
                    
                default:$this->handle=imagecreatefromjpeg($this->filename);
                    $this->imgfunc="imagejpeg";
                    break;
            }
        }
        public  function getImgType(){//获得图像的类型
            $ext=array();
            $ext=explode(".", $this->filename);
            $this->imgInfo=$ext;
        }
        
        public function getImgSize(){//获得图像大小
            $imgSize=array();
            $arr=getimagesize($this->filename);
            $imgSize['width']=$arr[0];
            $imgSize['height']=$arr[1];
            //var_dump($imgSize);
            $this->imgSize=$imgSize;
        }
        
        public function getNewImgSize(){//获得新图像的大小
            $newImgSize=array();
            if($this->imgSize['width']>$this->thum['width'] || $this->imgSize['height']>$this->thum['height']){
                    if($this->imgSize['width']>$this->imgSize['height']){
                        $newImgSize['width']=$this->thum['width'];
                        $newImgSize['height']=$this->imgSize['height']*($this->thum['width']/$this->imgSize['width']);    
                    }
                    if($this->imgSize['height']>$this->imgSize['width']){
                        $newImgSize['height']=$this->thum['height'];;
                        $newImgSize['width']=$this->imgSize['width']*($this->thum['height']/$this->imgSize['height']);                
                    }
                    if($this->imgSize['height']===$this->imgSize['width']){
                        $newImgSize['height']=$this->thum['height'];
                        $newImgSize['width']=$this->thum['width'];
                    }
                //echo "big";    
                }else{
                    $newImgSize['height']=$this->imgSize['height'];
                    $newImgSize['width']=$this->imgSize['width'];
                }
            $this->newImgSize=$newImgSize;
        }
        
        public  function  getAndSaveImg(){//重新生成图片
             $this->newHandle=imagecreatetruecolor($this->newImgSize['width'],$this->newImgSize['height']);
            imagecopyresized($this->newHandle, $this->handle, 0, 0, 0, 0, $this->newImgSize['width'], $this->newImgSize['height'], $this->imgSize['width'], $this->imgSize['height']);
            call_user_func_array($this->imgfunc,array($this->newHandle,"newImg/0001.png"));//这里的名字你可以自己根据自己的规则来替换,任何格式的都可以
        }
        
         function __destruct(){
            imagedestroy($this->handle);
            imagedestroy($this->newHandle);
        }}
    //这个东西是自动生成缩略图的,只需要你上传图片就行了,然后把服务器上面的图片路径给他就行了