2014-07-21 71 views
0

我必須上傳符合最大寬度尺寸和最大文件大小的圖像文件。PHP - 壓縮映像以滿足文件大小限制

我有代碼檢查寬度大小,並調整圖像大小以滿足最大圖像寬度。

然而,當我保存文件,我可以將質量

imagejpeg($imgObject , 'resized/50.jpg' , 50); //save image and set quality 

我想要做的是避免設定一個標準的質量,爲被提交的圖片來自質量變化高度和可能低開始。

圖像的質量應儘可能高,不超過最大文件大小限制。

我唯一的解決方案是以不同的質量保存圖像的幾個版本,檢查每個文件的大小,並選擇最好的一個。這有效,但非常緩慢並且過程密集。

有關如何做得更好的建議?

謝謝

+0

如果您決定採用「多個版本」路線,您可以創建一個簡單的學習算法,根據之前結果的平均值在第一次迭代中選擇維度。這將使算法隨着時間的推移更有效率。 – BazzyTK

回答

-1

不幸的是,估計最終文件的大小並不是你可以做的,因爲你無法訪問JPEG編碼器的內部狀態。

你可以做的一件事是壓縮一個較小的圖像版本並從那裏推斷。寬度和高度減少4意味着計算機只能處理十六分之一的像素。這裏的訣竅是如何準備有代表性的測試圖像。使用imagecopyresampled()或imagecopyresized()縮小圖像將不起作用。它太多地改變了壓縮特性。相反,你想要做的是每第四個8x8片從原來的圖像複製:

$width1 = imagesx($img1); 
$height1 = imagesy($img1); 
$width2 = floor($width1/32) * 8; 
$height2 = floor($height1/32) * 8; 
$img2 = imagecreatetruecolor($width2, $height2); 
for($x1 = 0, $x2 = 0; $x2 + 8 < $width2; $x1 += 32, $x2 += 8) { 
    for($y1 = 0, $y2 = 0; $y2 + 8 < $height2; $y1 += 32, $y2 += 8) { 
     imagecopy($img2, $img1, $x2, $y2, $x1, $y1, 8, 8); 
    } 
} 

壓縮在不同的質量級別較小的圖像和獲取尊重的文件大小。將它們乘以16來得出對於原始圖像會得到什麼的相當好的估計。

+0

有趣,謝謝。 – user1017063

+0

你有沒有例子? – Bytemain

0

不,這是最佳的可能。