2012-02-27 297 views
2

我一直在努力弄清楚如何在PHP中調整上傳圖片的大小,使其不會小於給定大小(650x650)。但是,如果用戶上傳的圖片在任一邊上都小於我的650最小值,則不會採取任何操作。將圖片大小調整爲最小寬度/高度

場景1 - 一幅2000像素寬的371像的圖像被更新 - 這不會被調整大小,因爲371像素已經小於我的最小值。

場景2 - 上傳一張2000像素到1823px的圖像 - 這裏我應該調整圖像的大小盡可能接近最小,但不允許寬度或高度低於650像素。

這是我一直沿着到目前爲止思考(我使用的是優秀的simpleImage腳本,以幫助調整和獲取尺寸)行:

$curWidth = $image->getWidth(); 
$curHeight = $image->getHeight();    
$ratio = $curWidth/$curHeight; 

if ($curWidth>$minImageWidth && $curHeight>$minImageHeight) 
{ 
    //both dimensions are above the minimum, so we can try scaling 
    if ($curWidth==$curHeight) 
    { 
     //perfect square :D just resize to what we want 
     $image->resize($minImageWidth,$minImageHeight); 
    } 
    else if ($curWidth>$curHeight) 
    { 
     //height is shortest, scale that. 
     //work out what height to scale to that will allow 
     //width to be at least minImageWidth i.e 650. 
     if ($ratio < 1) 
     { 
      $image->resizeToHeight($minImageWidth*$ratio); 
     } 
     else 
     { 
      $image->resizeToHeight($minImageWidth/$ratio); 
     } 
    } 
    else 
    { 
     //width is shortest, so find minimum we can scale to while keeping 
     //the height above or equal to the minimum height. 
     if ($ratio < 1) 
     { 
      $image->resizeToWidth($minImageHeight*$ratio); 
     } 
     else 
     { 
      $image->resizeToWidth($minImageHeight/$ratio); 
     } 
} 

但是這給了我一些奇怪的結果,有時它仍然會低於最小值。其中唯一符合預期的部分是對尺寸在最小值以上的測試 - 它不會縮小任何太小的尺寸。

我認爲我最大的問題在於,我沒有完全理解圖像寬高比和尺寸之間的關係,以及如何計算出我能夠縮放到哪些尺寸高於最小值。有什麼建議麼?

+1

我對第一句話感到困惑。 「寬度和高度不小於設定的最小值」...然後它說2000x371不會調整大小,因爲它太短。你能澄清你需要的規則嗎?或者,也許我誤解了你。 – jon 2012-02-27 14:58:21

+0

我會更新,使其更清晰 - 基本上我想重新縮小到650最小寬度和高度的東西。也不應少 - 但如果有人上傳的圖像已經很小,則不應採取任何行動。 – jammypeach 2012-02-27 15:01:29

回答

4

試試這個:

$curWidth = $image->getWidth(); 
$curHeight = $image->getHeight();    
$ratio = min($minImageWidth/$curWidth,$minImageHeight/$curHeight); 
if ($ratio < 1) { 
    $image->resize(floor($ratio*$curWidth),floor($ratio*$curHeight)); 
} 

或本:

$image->maxarea($minImageWidth, $minImageHeight); 
+1

爲我工作,謝謝:)像往常一樣,我在腦海中解決了這個問題。不得不停止這樣做... – jammypeach 2012-02-27 15:17:28

2

試試這個:

$curWidth = $image->getWidth(); 
$curHeight = $image->getHeight();    
if ($curWidth>$minImageWidth && $curHeight>$minImageHeight) { 
    $ratio = $curWidth/$curHeight; 
    $zoom = image_ratio > 1 
     ? $minImageHeight/$curHeight 
     : $minImageWidth/$curWidth 
     ; 

    $newWidth = $curWidth * $zoom; 
    $newHeight = $curHeight * $zoom; 
} 
0

通用片段計算圖像的最小尺寸,但只有兩個維度大於最小尺寸。

list($width, $height) = getimagesize($image_dir); // Generic width and height of image 

// Define minimum size for image 
$min_width = 700; // Example minimum width 
$min_height = 500; // Example minimum height 

// Only scale if the image is larger than the minimum size 
if ($width > $min_width && $height > $min_height) { 

    // Determine the ratio which the image should be scaled with 
    $ratio = $min_height/$min_width < $height/$width ? $min_height/$height : $min_width/$width; 

    // Set new size 
    $new_width = $width * $ratio; 
    $new_height = $height * $ratio; 

    // Resize image 
    # image_resize($image, $new_width, $new_height) // Generic resize function 
} 

該算法的最小尺寸比($min_height/$min_width),以將當前圖像尺寸比($height/$width)進行比較。

  1. 如果當前圖像比率越大,圖像需要被縮放,以高度等於$min_height。設置$ratio = $height/$min_height
  2. 如果當前圖像比率較低,則圖像需要縮放,因此寬度等於$min_width。設置$ratio = $width/$min_width

要獲得正確的尺寸,請將寬度和高度乘以$ratio

$new_width = $width * $ratio; 
$new_height = $height * $ratio; 
相關問題