2012-12-13 73 views
4

我獲取圖像的大小,因爲它們上傳Imagick:設置壓縮級別自動達到最大文件大小

$im->getImageSize(); 

這將返回圖像的字節大小。

我想自動設置壓縮級別,以便文件大小永遠不會超過一定的大小。

public function getCompLevel($size) 
{ 
        $maxsize = 70000; // Set rough max size of file 
        $mincomp = 60; // Set minimum compression level allowed 


        if($size > $maxsize){ // If file size exceeds max allowed size, perform calculation 
         $comp = **EQUATION** 
        } 

     return ($comp < $mincomp) ? $mincomp : $comp; // if output is less than minimum allowed compression , return minimum. If not return calculated compression level 
} 

我試圖找出是方程:如果我要限制在70KB與60允許的最小壓縮級別(0-100規模),我會做這樣的事情開始需要根據文件大小計算所需壓縮級別的近似值。我知道這可能不是那麼準確,因爲顏色影響文件大小,但我希望儘可能接近。

任何幫助將不勝感激。

回答

2

我喜歡這個問題,雖然真的沒有正確的答案。我已經複製了多個實例,其中變量$x將表示從零開始的文件大小,並且將增加到最大文件大小的兩倍。另外,我創建了一個變量$equalizer。這個變量以指數形式工作,而將其設置爲100將創建更高的壓縮級別,或者接近0會產生更大的差距。

<?php 
$max_file_size = 70000; 
$max_compression = 60; 
$equalizer = 100; 

for($x=0;$x<$max_file_size+$max_file_size;$x+=10000){ 
    if($x < $max_file_size){ 
     echo $max_compression.'<br>'; 
    }else{ 
     echo $max_compression - (($x/$max_compression * $max_file_size)/($max_file_size * $max_compression * $equalizer)).'<br>'; 
    } 

}?> 

在,你的現實世界的情況,我會想象你的函數看起來像:

<?php 
function getCompLevel($size){ 
    $maxsize = 70000; 
    $compression = 60; 
    $equalizer = 100; 

    if($size > $maxsize){ 
     $compression = $compression - (($size/$compression * $maxsize)/($maxsize * $compression * $equalizer)); 
    } 

    return $compression; 
}?> 
+0

難以置信......這正是我期待的,似乎工作得很好。一個很好的答案,完全覆蓋整個大綱。非常感謝塞繆爾! – gordyr

+0

我真的很喜歡這個問題,很高興我能幫上忙 –