2016-08-08 3 views
3

이미지를 base64로 인코딩 된 문자열 프론트 엔드로 가져오고이를 디코드하여 서버의 이미지로 저장해야합니다. 이미지 형식은 png, gif 또는 jpeg 일 수 있습니다. 이 부분은 정상적으로 작동합니다. 하지만 때로는 사용자가 업로드 한 이미지가 매우 큰 크기가 될 수 있으므로 백엔드에서 이미지를 압축하려고하는데이 부분은 비참하게 실패했습니다.php- base64 디코딩 된 이미지 압축 실패

두 가지 기능이 있습니다. 하나는 base64 문자열을 이미지로 변환하고 다른 하나는 압축하는 것입니다.

문자열을 이미지로 변환하는 함수입니다.

function uploadTimelineImage($base64Img) 
{ 
    $data= array(); 
    $upAt=date('YmdHis'); 

    if (strpos($base64Img, 'data:image/png;base64') !== false) 
    { 
     $img = str_replace('data:image/png;base64,', '', $base64Img); 
     $img = str_replace(' ', '+', $img); 
     $data = base64_decode($img);  
     $extension= 'png'; 
    } 

    if (strpos($base64Img, 'data:image/gif;base64') !== false) 
    { 
     $img = str_replace('data:image/gif;base64,', '', $base64Img); 
     $img = str_replace(' ', '+', $img); 
     $data = base64_decode($img);  
     $extension= 'gif'; 
    } 

    if (strpos($base64Img, 'data:image/jpeg;base64') !== false) 
    { 
     $img = str_replace('data:image/jpeg;base64,', '', $base64Img); 
     $img = str_replace(' ', '+', $img); 
     $data = base64_decode($img);  
     $extension= 'jpeg'; 
    } 

    $fileName  = 'img'.$upAt.$extension; 
    $filePath  = 'foldername/'.'img'.$upAt.$extension; 

    //upload image to folder 
    $success = file_put_contents($filePath, $data); 
    $result = $success ? 1 : 0; 

    //call to compression function 
    $compressThisImg= $filePath; 
    $d = compress($compressThisImg, $fileName, 80); 

    if($result==1) 
    { 
     return $fileName; 
    } 
    else 
    { 
     return null; 
    } 

} 

그리고이 압축 않는 기능입니다 :

//Function to compress an image 
function compress($source, $destination, $quality) 
{ 
    $info = getimagesize($source); 

    if ($info['mime'] == 'image/jpeg') 
     $image = imagecreatefromjpeg($source); 

    elseif ($info['mime'] == 'image/gif') 
     $image = imagecreatefromgif($source); 

    elseif ($info['mime'] == 'image/png') 
     $image = imagecreatefrompng($source); 

    imagejpeg($image, $destination, $quality); 

    return $destination; 
} 

그러나 위의 기능을 어떤 압축을하지 않습니다, 그것은 발생 오류 :

failed to open stream: No such file or directory 

내 기능은 원본을 업로드 영상.

+0

일반적인주의 사항 : 이미 압축 된 형식 (png, gif, jpg)의 이미지를 압축하려고하면 의미가 없습니다. – arkascha

+0

이미지가 클 경우 더 큰 파일을 처리하기 위해 시스템의 .ini 파일을 조정해야 할 수도 있습니다. 대용량 파일이 업로드되는 경우이 주석을 긁을 수 있습니다. 뭔가 다른 것이 원인이고 나는 그것이 무엇인지 알 수 없습니다. 그러나 경로 설정 및 사용 권한을 확인하십시오. –

+0

어쨌든 크기가 줄어들고 그래도 선명도가 떨어질 것입니다. 어쨌든 백엔드에서 이미지의 크기를 줄이려고합니다. 내가 아는 한 base64는 이미지를 문자열로 변환하지만 크기를 줄이지는 못합니다. 원본 파일과 업로드 된 파일을 확인했습니다. @arkascha – Annabelle

답변

0

왜이 유형의 이미지 형식 base64 edncoded 이미지 문자열을 만들 때이 기능을 사용하지 않습니까?

function uploadTimelineImage($base64Img,$h,$w) 
{ 
    $im = imagecreatefromstring($base64Img); 
    if ($im !== false) { 


     $width = imagesx($im); 
     $height = imagesy($im); 
     $r = $width/$height; // ratio of image 

     // calculating new size for maintain ratio of image 
     if ($w/$h > $r) { 
      $newwidth = $h*$r; 
      $newheight = $h; 
     } else { 
      $newheight = $w/$r; 
      $newwidth = $w; 
     } 

     $dst = imagecreatetruecolor($newwidth, $newheight); 
     imagecopyresampled($dst, $im, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 
     imagedestroy($im); 

     $fileName = 'img'.date('Ymd').'.jpeg'; 
     $filepath = 'folder/'.$fileName ; 
     imagejpeg($dst,$filepath); 

     imagedestroy($dst); 
     return $fileName; 
    } 
    else 
    { 
     return ""; 
    } 
} 
+0

이미지의 크기가 줄어들 수 있습니까[email protected] Vidja – Annabelle

+0

이미지의 이미지 크기 또는 품질을 줄이시겠습니까? –

+0

이미지 크기가 대부분입니다 .. 약간의 선명도를 잃어도 상관 없습니다. 그러나 대부분 이미지 크기. @Haresh Vidja – Annabelle