2012-08-16 35 views
3

我有一個腳本,這對於一個簡單的任務來說非常大,因爲它經常被嵌套。它的作用是這樣的:計算新的圖像大小 - 我怎樣才能使這個效率更高/更短

  • 得到的圖像
  • 電流的大小得到新的最大尺寸
  • 計算圖像將被調整到尺寸(寬高比始終保持):
    • ,如果圖像是不是新的尺寸更小的:保持原始尺寸
    • 如果最大新的維度具有x和y值:標度圖像,以適應這兩個值
    • 如果最大新的維度僅具有的x VALU E:規模,以適應至少爲x
    • 如果最大新的層面只有一個y值:規模,以適應至少Ÿ

這是腳本:

//example values, whereas 'new' is the maximum range for the new image 
$dimensions = array(1920,1200); 
$dimensionsNew = array(160, 0); 
// percentage the image must be scaled 
$percentages = array(0,0); 

//calculate scale range 
if ($dimensionsNew[0] != 0) $percentages[0] = $dimensions[0]/$dimensionsNew[0]; 
if ($dimensionsNew[1] != 0) $percentages[1] = $dimensions[1]/$dimensionsNew[1]; 

//get new dimensions 
if (($dimensions[0] <= $dimensionsNew[0]) && ($dimensions[1] <= $dimensionsNew[1])) { 
    $dimensionsNew[0]  = $dimensions[0]; 
    $dimensionsNew[1]  = $dimensions[1]; 
} elseif ($dimensionsNew[0] == 0) { 
    if ($dimensions[1] <= $dimensionsNew[1]) { 
     $dimensionsNew[0] = $dimensions[0]; 
     $dimensionsNew[1] = $dimensions[1]; 
    } else { 
     $dimensionsNew[0] = ceil($dimensions[0]/$percentages[1]); 
    } 
} elseif ($dimensionsNew[1] == 0) { 
    if ($dimensions[0] <= $dimensionsNew[0]) { 
     $dimensionsNew[0] = $dimensions[0]; 
     $dimensionsNew[1] = $dimensions[1]; 
    } else { 
     $dimensionsNew[1] = ceil($dimensions[1]/$percentages[0]); 
    } 
} elseif ($percentages[0] < $percentages[1]) { 
    $dimensionsNew[1]  = ceil($dimensions[1]/$percentages[1]); 
} else { 
    $dimensionsNew[0]  = ceil($dimensions[0]/$percentages[0]); 
} 

它做它應該做的事情。但是有沒有更簡單的方法來做到這一點?我想我經常查看這些代碼,找不到優化的方法。

+1

僅有評論重新代碼可讀性收縮,命名你的數組元素,如'$尺寸=陣列(X = 1920,Y = 1200 );'會讓你以後參考x和y。 – DaveP 2012-08-16 11:12:13

+0

好想法啊。易於維護,比0 | 1 - 我可以看到。 – insertusernamehere 2012-08-16 11:15:26

回答

2

您應該在尺寸的比例上使用「min」來計算所需的比例尺。在此是> 1,則沒有收縮ncessary,如果< 1然後由適量

//example values, whereas 'new' is the maximum range for the new image 
$dimensions = array(1920,1200); 
$dimensionsNew = array(160, 0); // NOTE: 0 won't work, but it's your example ;) 

// What scale do we need to go to 
$scaleRequired = min($dimensionsNew[0]/$dimensions[0], $dimensionsNew[1]/$dimensions[1]); 

if ($scaleRequired < 1) { 
    $finalDimensions = array (
     $dimensions[0] * $scaleRequired, 
     $dimensions[1] * $scaleRequired); 

    // Resize to $finalDimensions 

} else { 
    // Do nothing 
} 
+0

'0不會工作,但它是你的榜樣;)' - 爲什麼不呢?當指定'y'不受限制時,他應該使用什麼呢?除非舊維數中有零,否則最終不會有零除,這顯然是不可能的。 – DaveRandom 2012-08-16 11:30:58

+0

'min'功能在這裏非常時尚。所以這樣做會使圖像始終適合新的維度。它不適用於其他案件,我是對的嗎?在示例(160,0)中,圖像將被縮放爲適合160像素的寬度,並且高度根據高寬比進行計算。 – insertusernamehere 2012-08-16 11:33:05

+0

我認爲這是「最大X尺寸是160,最大Y尺寸是0」這就是爲什麼我說它不會工作 - 因爲最小規則。如果你想允許0作爲「允許任何東西」,那麼你將需要一些「jiggery pokery」或簡單地設置爲999999,這基本上將它排除在等式之外。 – Robbie 2012-08-16 11:52:50

相關問題