2017-04-09 58 views
0

我有一個問題陳述,需要保持上傳圖像的高寬比。如何在調整上傳圖像大小時保持寬高比

如果照片被上傳,你需要創建三種尺寸,A) 310X230(略圖)B)960X400(詳情圖片)C)原始大小(全 圖片)的尺寸將有確切的創建尺寸。如果一張照片是 不等於任何尺寸的縱橫比,則縮放至該尺寸,然後裁剪額外部分。

我已經實現了使用PHP GD庫下面

if($_SERVER["REQUEST_METHOD"] == "POST") 
{ 
    $image =$_FILES["file"]["name"]; 
    $uploadedfile = $_FILES['file']['tmp_name']; 


    if ($image) 
    { 

     $filename = stripslashes($_FILES['file']['name']); 

     $extension = getExtension($filename); 
     $extension = strtolower($extension); 


if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif")) 
     { 

      $change='<div class="msgdiv">Unknown Image extension </div> '; 
      $errors=1; 
     } 
     else 
     { 

$size=filesize($_FILES['file']['tmp_name']); 


if ($size > MAX_SIZE*1024) 
{ 
    $change='<div class="msgdiv">You have exceeded the size limit!</div> '; 
    $errors=1; 
} 


if($extension=="jpg" || $extension=="jpeg") 
{ 
$uploadedfile = $_FILES['file']['tmp_name']; 
$src = imagecreatefromjpeg($uploadedfile); 

} 
else if($extension=="png") 
{ 
$uploadedfile = $_FILES['file']['tmp_name']; 
$src = imagecreatefrompng($uploadedfile); 

} 
else 
{ 
$src = imagecreatefromgif($uploadedfile); 
} 

//echo $src; 

list($width,$height)=getimagesize($uploadedfile); 


$newwidth=$width; 
$newheight=($height/$width)*$newwidth; 
$tmp=imagecreatetruecolor($newwidth,$newheight); 


$newwidth1=310; 
$newheight1=230; 
$tmp1=imagecreatetruecolor($newwidth1,$newheight1); 


$newwidth2=960; 
$newheight2=400; 
$tmp2=imagecreatetruecolor($newwidth2,$newheight2); 

imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height); 

imagecopyresampled($tmp1,$src,0,0,0,0,$newwidth1,$newheight1,$width,$height); 

imagecopyresampled($tmp2,$src,0,0,0,0,$newwidth2,$newheight2,$width,$height); 

$filename = "images/medium/". $_FILES['file']['name']; 

$filename1 = "images/thumbnail/small". $_FILES['file']['name']; 

$filename2 = "images/full/". $_FILES['file']['name']; 


imagejpeg($tmp,$filename,100); 

imagejpeg($tmp1,$filename1,100); 

imagejpeg($tmp2,$filename2,100); 

imagedestroy($src); 
imagedestroy($tmp); 
imagedestroy($tmp1); 
imagedestroy($tmp2); 
}} 

} 
+0

你是否也想裁剪原始的全尺寸圖像?看起來你在調整大小的圖像上有不同的長寬比? –

回答

0

代碼這是很複雜,既調整和作物多個圖像上傳圖像與3種不同的尺寸,但這裏可能工作的解決方案爲您提供:

if($_SERVER["REQUEST_METHOD"] == "POST"){ 
    $image =$_FILES["file"]["name"]; 
    $uploadedfile = $_FILES['file']['tmp_name']; 

    if($image){ 
     $filename = stripslashes($_FILES['file']['name']); 
     $extension = getExtension($filename); 
     $extension = strtolower($extension); 

     if(($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif")) { 
      $change='<div class="msgdiv">Unknown Image extension </div> '; 
      $errors=1; 
     } else { 
      $size=filesize($_FILES['file']['tmp_name']); 

      if($size > MAX_SIZE*1024){ 
       $change='<div class="msgdiv">You have exceeded the size limit!</div> '; 
       $errors=1; 
      } 

      if($extension=="jpg" || $extension=="jpeg") { 
       $uploadedfile = $_FILES['file']['tmp_name']; 
       $src = imagecreatefromjpeg($uploadedfile); 
      } else if($extension=="png"){ 
       $uploadedfile = $_FILES['file']['tmp_name']; 
       $src = imagecreatefrompng($uploadedfile); 
      } else { 
       $src = imagecreatefromgif($uploadedfile); 
      } 


     list($width,$height)=getimagesize($uploadedfile); 

     /* ORIGINAL ASPECT RATIO */  
     $original_aspect_ratio = $width/$height; 

     /* RESIZE AND CROP THUMBNAIL (MEDIUM SIZE) */ 
     $new_width = 960; // SET DESIRED WIDTH 
     $new_height = 400; // SET DESIRED HEIGHT  
     $new_aspect_ratio = $new_width/$new_height; 

     if ($original_aspect_ratio > $new_aspect_ratio) { 
      /* source image is wider */ 
      $temp_height = $new_height; 
      $temp_width = (int) ($new_height * $original_aspect_ratio); 
     } else { 
      /* source image is similar or taller */ 
      $temp_width = $new_width; 
      $temp_height = (int) ($new_width/$original_aspect_ratio); 
     } 

     /* Resize to a temporary GD image */ 
     $temp = imagecreatetruecolor($temp_width, $temp_height); 
     imagecopyresampled($temp,$src,0,0,0,0,$temp_width,$temp_height,$width,$height); 

     /* Copy cropped region from temporary image into the desired GD image */ 
     $x0 = ($temp_width - $new_width)/2; 
     $y0 = ($temp_height - $new_height)/2; 
     $medium = imagecreatetruecolor($new_width, $new_height); 
     imagecopy($medium,$temp,0,0,$x0,$y0,$new_width,$new_height); 

     /* SAVE TO FILE AND CLEAN UP */ 
     imagedestroy($temp);// CLEANUP TEMP IMAGE 
     $medium_filename = "images/medium/". $_FILES['file']['name']; 
     imagejpeg($medium,$medium_filename,100); 
     imagedestroy($medium); 

     /* RESIZE AND CROP SMALL IMAGES, SAME PROCEDURE AS ABOVE */ 
     $new_width = 310; // SET DESIRED WIDTH 
     $new_height = 230; // SET DESIRED HEIGHT  
     $new_aspect_ratio = $new_width/$new_height; 

     if ($original_aspect_ratio > $new_aspect_ratio) { 
      $temp_height = $new_height; 
      $temp_width = (int) ($new_height * $original_aspect_ratio); 
     } else { 
      $temp_width = $new_width; 
      $temp_height = (int) ($new_width/$original_aspect_ratio); 
     } 

     $temp = imagecreatetruecolor($temp_width, $temp_height); 
     imagecopyresampled($temp,$src,0,0,0,0,$temp_width,$temp_height,$width,$height); 

     $x0 = ($temp_width - $new_width)/2; 
     $y0 = ($temp_height - $new_height)/2; 
     $small = imagecreatetruecolor($new_width, $new_height); 
     imagecopy($small,$temp,0,0,$x0,$y0,$new_width,$new_height); 

     /* SAVE TO FILE AND CLEAN UP */ 
     imagedestroy($temp);// CLEANUP TEMP IMAGE 
     $small_filename = "images/thumbnail/small". $_FILES['file']['name']; 
     imagejpeg($small,$small_filename,100); 
     imagedestroy($small); 


     /* ORIGINAL SIZE. NO RESIZING OR CROPPING... NOT NEEDED? YOU DECIDE... */   
     $full=imagecreatetruecolor($width,$height); 
     imagecopyresampled($full,$src,0,0,0,0,$width,$height,$width,$height); 

     /* SAVE TO FILE AND CLEAN UP */ 
     $full_filename = "images/full/". $_FILES['file']['name']; // ORIGINAL 
     imagejpeg($full,$full_filename,100); 
     imagedestroy($full); 

     imagedestroy($src); // CLEAN UP ORIGINAL SOURCE FILE 

     } 
    } 
} 

的代碼沒有測試,主要是從這個博客帖子的啓發:http://salman-w.blogspot.se/2009/04/crop-to-fit-image-using-aspphp.html

由於您有多個圖像,因此在我建議的解決方案中有很多重複的代碼。你可以考慮把一些重複的代碼塊分成更小的可重用函數,例如計算不同圖像的縱橫比。

+0

謝謝,它爲我工作 – samar

相關問題