본문 바로가기

프로그래밍

[PHP] 업로드하는 사진 비율로 줄이기

반응형

input의 이름이 pic라는 가정으로 아래와 같이 진행하시면 됩니다. 

 



if($_FILES['pic']['name']){  // 파일명을 time함수를 이용해서 숫자로 변환하기 
    $tmp = explode(".",$_FILES['pic']['name']);
    $ext =  end($tmp);

    $fn = time().".".$ext;
    $fn = strtolower($fn); 

}

 

move_uploaded_file( $_FILES['pic']['tmp_name'], "./data/".$fn);  // data폴더에 파일을 업로드

 

$src = "./data/".$fn;   // 원본파일
$dst = "./data/".$fn;   // 대상파일(덮어쓸꺼라 같은이름으로 처리) 
 
$quality = '80';    //-- jpg 퀄리티 
$size = '1500';    //-- 줄일 크기 pixel (너비, 또는 높이에 적용) 
//$ratio = '4:3';        //-- 이미지를 4:3 비율로 잘라냄 
$ratio = 'false';        //-- 원본 이미지비율을 유지 
$get_size = _getimagesize($src, $size, $ratio); 
$result = resize_image($dst, $src, $get_size, $quality, $ratio); 
 

 

// 사용함수들 

 


function resize_image($destination, $departure, $size, $quality='80', $ratio='false'){ 
 
    
    if($size[2] == 1)    //-- GIF 
        $src = imagecreatefromgif($departure); 
    elseif($size[2] == 2) //-- JPG 
        $src = imagecreatefromjpeg($departure); 
    else    //-- $size[2] == 3, PNG 
        $src = imagecreatefrompng($departure); 

    $dst = imagecreatetruecolor($size['w'], $size['h']); 


    $dstX = 0; 
    $dstY = 0; 
    $dstW = $size['w']; 
    $dstH = $size['h']; 

    if($ratio != 'false' && $size['w']/$size['h'] <= $size[0]/$size[1]){ 
        $srcX = ceil(($size[0]-$size[1]*($size['w']/$size['h']))/2); 
        $srcY = 0; 
        $srcW = $size[1]*($size['w']/$size['h']); 
        $srcH = $size[1]; 
    }elseif($ratio != 'false'){ 
        $srcX = 0; 
        $srcY = ceil(($size[1]-$size[0]*($size['h']/$size['w']))/2); 
        $srcW = $size[0]; 
        $srcH = $size[0]*($size['h']/$size['w']); 
    }else{ 
        $srcX = 0; 
        $srcY = 0; 
        $srcW = $size[0]; 
        $srcH = $size[1]; 
    } 

    @imagecopyresampled($dst, $src, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH); 
    @imagejpeg($dst, $destination, $quality); 
    @imagedestroy($src); 
    @imagedestroy($dst); 

    return TRUE; 


// $img : 원본이미지 
// $m : 목표크기 pixel 
// $ratio : 비율 강제설정 
function _getimagesize($img, $m, $ratio='false'){ 

    $v = @getImageSize($img); 

    if($v === FALSE || $v[2] < 1 || $v[2] > 3) 
        return FALSE; 

    $m = intval($m); 

    if($m > $v[0] && $m > $v[1]) 
        return array_merge($v, array("w"=>$v[0], "h"=>$v[1])); 

    if($ratio != 'false'){ 
        $xy = explode(':',$ratio); 
        return array_merge($v, array("w"=>$m, "h"=>ceil($m*intval(trim($xy[1]))/intval(trim($xy[0]))))); 
    }elseif($v[0] > $v[1]){ 
        $t = $v[0]/$m; 
        $s = floor($v[1]/$t); 
        $m = ($m > 0) ? $m : 1; 
        $s = ($s > 0) ? $s : 1; 
        return array_merge($v, array("w"=>$m, "h"=>$s)); 
    } else { 
        $t = $v[1]/intval($m); 
        $s = floor($v[0]/$t); 
        $m = ($m > 0) ? $m : 1; 
        $s = ($s > 0) ? $s : 1; 
        return array_merge($v, array("w"=>$s, "h"=>$m)); 
    } 

 

 

 

 

반응형