[已解决]PHP图像调整的问题

#1 prince

问题:文件由表单提交,最后的imagejpeg()/imagegif()/imagepng()写新文件时 imagecopyresampled()这个好像不起作用,出来的图像是黑色,好像没有从源文件取得图像
function pictureSave(){
        $upDir = '../img/user/';//上传路径
        if ($_FILES["file"]["error"] > 0){
            return   $_FILES["file"]["error"];
         }else{
            $file = fopen($_FILES["file"]["tmp_name"], "rb");//以只读模式打开文件
            $bin = fread($file, 2); //只读取前2字节
            fclose($file);
            $strInfo = @unpack("C2chars", $bin);
            $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
            $type_r = $this -> file_judge($typeCode);
            if ($type_r[0] == true){
            $bgWidth = 450;//设置背景宽度
            $bgHeight = 450;//设置背景高度
            list($width, $height) = getimagesize($upPath.$picture);
            list($dstwidth , $dstheight) = $this -> setW_H($width , $height , $bgWidth , $bgHeight);
            $begin_X = ($bgWidth - $dstwidth)/2;//目标文件绘图X坐标起始点的位置
            $begin_Y = ($bgHeight - $dstheight)/2;//目标文件绘图Y坐标起始点的位置
            $end_X = $bgWidth-($bgWidth - $dstwidth);//目标文件X坐标结束绘图的位置
            $end_Y = $bgWidth-($bgHeight - $dstheight);//目标文件Y坐标结束绘图的位置
            //加载图像
            $newIma = imagecreatetruecolor($bgWidth, $bgHeight);
            $imgName = $_SESSION[username].'_'.date("Y-m-d_His") . $type_r[1];
            //move_uploaded_file($_FILES["file"]["tmp_name"] , $upDir.$imgName);
            /*开始调整大小,imagecopyresized ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )*/
            if ($type_r[1] == '.jpg') $source = imagecreatefromjpeg($_FILES["file"]["tmp_name"]);
            if ($type_r[1] == '.gif') $source = imagecreatefromgif($_FILES["file"]["tmp_name"]);
            if ($type_r[1] == '.png') $source = imagecreatefrompng($_FILES["file"]["tmp_name"]);
            imagecopyresampled($newIma, $source, $begin_X, $begin_Y, 0, 0, $end_X, $end_Y, $width, $height);
            //unlink($upPath.$picture);覆盖原图像
            if($type_r[1]=='.jpg')imagejpeg($newIma,$upDir.$imgName,100);
            if($type_r[1]=='.gif')imagegif($newIma,$upDir.$imgName,100);
            if($type_r[1]=='.png')imagepng($newIma,$upDir.$imgName,100);
            imagedestroy($newIma);
            $cplist_album = spClass("cplist_album");
            $newPic = array('cp_id' => $this -> spArgs('cp_id'),'picture' => $imgName,'picDesc' => $this -> spArgs('picDesc'));
            $cplist_album -> create($newPic);
            if ($cplist_album == false){
                $msg = '上传图片时记录到数据库出错,请向系统管理员报告此问题!';
                $url = spUrl("add_new","UploadPic",'cp_id='.$this -> spArgs('cp_id'));
                $this -> error($msg,$url);
                }
              else{
                $msg = '上传图片成功';
                $url = spUrl("add_new","UploadPic".'&cp_id='.$this -> spArgs('cp_id'));
                $this -> success($msg,$url);
             }
            }
            else{
              //return false;
              echo 'You want to upload files is lawlessness file.';
              exit;
            }
}
}
    //file_judge()判断文件是否是指定类型,如果合法则以数组类型返回true和扩展名
    function file_judge($typeValue){
        switch ($typeValue){
            case 255216://这个是jpg类型
              $typeArray = array(true , '.jpg');
              return $typeArray;
              break;
            case 7173:
              $typeArray = array(true , '.gif');
              return $typeArray;
              break;
            case 13780:
              $typeArray = array(true , '.png');
              return $typeArray;
              break;
            default:
              return $typeArray = array(false,'');//默认返回false和空
            }

    }


//设置新图像宽度及高度,参数及顺序:原图宽度,原图高度,背景宽度,背景高度   
function setW_H($src_width, $src_height,$bgWidth,$bgHeight){
    if ((($src_width*1.05) < $bgWidth)&(($src_height*1.05) < $bgHeight)){
        $new = array($src_width,$src_height);//如果源图像的高和宽的1.05倍都小于背景就直接返回源高宽
        return $new;
        }
    //判断源图像的高或宽其中一个是否大于背景的高或宽
    if (($src_width > $bgWidth)||($src_height > $bgHeight)){
          if ($src_width > $src_height){//如果源图像的宽度大于高度
            $new_width = $bgWidth - ($src_width*0.02);
            $new_height = $src_height*($bgWidth/$src_width) - ($src_height*0.02);
            $new = array($new_width,$new_height);
            return $new;
           }
          if ($src_width < $src_height){//如果源图像的高度大于宽度
            $new_width = ($src_width * ($bgHeight/$src_height)) - ($src_width*0.02);
            $new_height = $bgHeight - ($src_height*0.02);
            $new = array($new_width,$new_height);
            return $new;
           }
    }
}

2010-11-20 19:36:45

#2 prince

回复 1 prince


    原来是list($width, $height) = getimagesize($upPath.$picture);文件没给对,这个应该是给上传的临时文件,所以致使setW_H返回的是空的

2010-11-20 20:15:55

#3 jake

:P我对PHP图像操作也不熟悉,一般都会用图像类库进行操作的,呵呵

2010-11-20 20:56:41