2012-09-23 23 views
1

我有一個PHP腳本,用戶可以上傳圖片。 如果文件大小大於'X'千字節,我想讓腳本降低圖像質量(jpeg)。PHP:滿足條件時更改圖像質量?

事情是這樣的:

if($_FILES['uploaded_img']['size'] > $file_size_limit){ 
    // code that lowers the quality of the uploaded image but keeps the image width and height 
} 

,這是什麼最好的方法?

ps:我不想改變圖像的寬度和高度。

+0

閱讀圖片功能:http://php.net/manual/en/ref.image.php您可以使用'imagejpeg'以另一種質量保存圖像,但您不知道原始質量雖然。 – Cyclonecode

+0

是的,我想我不能告訴圖像質量。這就是爲什麼當文件大小超過一定限制時我只能運行這些代碼。 – user1091856

回答

3

當然可以。做這樣的事情。

$upload = $_FILES['uploaded_img']; 
$uploadPath = 'new/path/for/upload/'; 
$uploadName = pathinfo($upload['name'], PATHINFO_FILENAME); 
$restrainedQuality = 75; //0 = lowest, 100 = highest. ~75 = default 
$sizeLimit = 2000; 

if($upload['size'] > $sizeLimit) { 
    //open a stream for the uploaded image 
    $streamHandle = @fopen($upload['tmp_name'], 'r'); 
    //create a image resource from the contents of the uploaded image 
    $resource = imagecreatefromstring(stream_get_contents($streamHandle)); 

    if(!$resource) 
     die('Something wrong with the upload!'); 

    //close our file stream 
    @fclose($streamHandle); 

    //move the uploaded file with a lesser quality 
    imagejpeg($resource, $uploadPath . $uploadName . '.jpg', $restrainedQuality); 
    //delete the temporary upload 
    @unlink($upload['tmp_name']); 
} else { 
    //the file size is less than the limit, just move the temp file into its appropriate directory 
    move_uploaded_file($upload['tmp_name'], $uploadPath . $upload['name']); 
} 

這將接受PHP GD支持的任何圖像格式(假設它安裝在您的服務器上,很可能是)。如果圖片小於限制,它只會將原始圖片上傳到您指定的路徑。

+0

WOW從來沒有想過這可能是如此簡單的PHP。謝謝。 – user1091856

+0

沒問題。很高興我能幫上忙。 –

+0

我知道這與我的問題沒有直接關係,但有必要'取消'臨時文件?不會服務器自動爲我做? – user1091856

3

您的基本方法(在奧斯汀的答案中實現)將在某些時候有效,但請務必記住質量!=文件大小。雖然它們通常是相互關聯的,但降低jpeg文件的質量完全有可能(甚至是常見的)實際上會導致LARGER文件。這是因爲上傳到系統的任何JPEG已經通過JPEG壓縮公式運行(通常質量爲79或80)。根據原始圖像,該過程將創建僞影/更改結果圖像。當你通過jpeg壓縮算法運行這個已經優化過的圖像時,它不會「知道」原始圖像是什麼樣子......所以它會將傳入的jpeg視爲一個全新的無損文件並嘗試複製它儘可能接近...包括在原始過程中創建的任何工件。再加上原來的jpeg壓縮已經利用了大多數「簡單」壓縮技巧,結果很可能是第二次壓縮會導致看起來更難看的圖像(副本問題),但不會更小文件。

我做了一些測試,看看截斷點在哪裏,如果原始圖像的壓縮比很低(q = 99),節省了大量空間,重新壓縮到q = 75,不出所料。如果原稿在q = 75壓縮(對於圖形程序默認很常見),那麼輔助q = 75壓縮看起來更糟糕,但會導致與原始文件大小相同的文件大小。如果原稿的壓縮程度較低(q = 50),那麼次級q = 75壓縮會導致一個更大的文件(對於這些測試,我使用了三張複雜的照片......顯然,具有特定齶/成分的圖像會有不同的表現通過這些壓縮)。 注:我使用的煙花CS4本次測試...我意識到,這些quality indicators have no standardization between platforms

正如下面的評論中指出,從文件格式,如PNG至JPEG移動通常最終會顯著較小(雖然沒有任何透明度),但是從JPEG - > JPEG(或GIF-> JPEG,特別是對於簡單或小型上顎圖像)通常無濟於事。

無論如何,您仍然可以嘗試使用奧斯汀描述的壓縮方法,但確保在完成後比較兩個圖像的文件大小。如果只有小增量增益或新文件較大,則默認回到原始圖像。

+0

那麼,我唯一的目標是防止用戶上傳沉重的圖像文件,這是迄今爲止我發現的唯一解決方案。 – user1091856

+0

您對JPEG的實例是正確的,但轉換PNG - > JPG通常會產生大小不一。 –

+0

是的。不僅如此,我還嘗試使用帶有透明背景的png代碼,新的jpeg全部搞砸了。但是,這還不如告訴用戶他們必須壓縮圖像而不做任何事情。 – user1091856