PHP GD 圖形庫是一種在 PHP 中進行圖片處理的強大工具。其中,壓縮圖片是常見的一個應用場景。在日常開發中,我們經常會遇到需要上傳或者下載大量圖片的任務,如果不對圖片進行壓縮處理,既會對服務器造成壓力,也會使得用戶的流量消耗加劇。因此,本文將介紹如何利用 PHP GD 對圖片進行壓縮處理。
首先,我們來看一個簡單的例子。假設我們有一張名為“example.jpg”的圖片,我們需要將其壓縮成 50% 的大小,那么可以采用以下代碼:
$image = imagecreatefromjpeg('example.jpg'); $width = imagesx($image); $height = imagesy($image); $new_width = $width * 0.5; $new_height = $height * 0.5; $new_image = imagecreatetruecolor($new_width, $new_height); imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); imagejpeg($new_image, 'example_new.jpg', 100);在上述代碼中,我們通過“imagecreatefromjpeg”函數創建了一個圖片對象。之后,通過“imagesx”和“imagesy”函數獲取該圖片的寬和高。接著,我們又根據原圖片的大小生成一個新的圖片對象,并通過“imagecopyresampled”函數將原圖片壓縮到了 50% 的大小。最后,調用“imagejpeg”函數將新生成的圖片保存到了服務器上。 當然,針對上述代碼也存在一些不足之處。比如,代碼中的圖片壓縮比例是固定的,我們無法針對不同的圖片進行不同的壓縮處理。另外,壓縮質量也是一個需要考慮的問題,太低的壓縮質量會導致圖片失真,太高的壓縮質量則會浪費帶寬。因此,我們接下來需要探討如何更好地處理這些問題。 首先,我們可以通過計算每張圖片的大小,動態地調整壓縮比例,以適應不同的場景。例如,對于超過 1 MB 的圖片,我們可以選擇將其壓縮至原來的 50%,而對于小于 500 KB 的圖片,則可以壓縮至原來的 70%。一種簡單的實現方案就是借助“filesize”函數獲取當前文件的大小,如下所示:
$filesize = filesize('example.jpg'); if ($filesize >1024 * 1024) { $compress_ratio = 0.5; } else if ($filesize< 500 * 1024) { $compress_ratio = 0.7; } else { $compress_ratio = 0.9; } $image = imagecreatefromjpeg('example.jpg'); $width = imagesx($image); $height = imagesy($image); $new_width = $width * $compress_ratio; $new_height = $height * $compress_ratio; $new_image = imagecreatetruecolor($new_width, $new_height); imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); imagejpeg($new_image, 'example_new.jpg', 100);其次,針對壓縮質量的問題,我們可以使用 PHP GD 的“imagejpeg”函數中的第三個參數來控制壓縮質量,從而達到壓縮效果的優化。該參數的取值范圍為 0 ~ 100,其中 0 表示壓縮質量最差,100 表示壓縮質量最好。為了衡量不同壓縮質量對圖片的影響,我們可以通過以下代碼來生成不同質量的圖片進行比較:
for ($quality = 10; $quality<= 90; $quality += 20) { $image = imagecreatefromjpeg('example.jpg'); $width = imagesx($image); $height = imagesy($image); $new_width = $width * 0.5; $new_height = $height * 0.5; $new_image = imagecreatetruecolor($new_width, $new_height); imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); imagejpeg($new_image, 'example_quality_' . $quality . '.jpg', $quality); }在上述代碼中,我們通過循環生成了 5 張不同壓縮質量的圖片,保存到了服務器上。通過比較這些圖片的大小以及視覺效果,我們可以得出一個相對較優的壓縮質量。 綜上所述,PHP GD 圖形庫為我們提供了很好的圖片壓縮解決方案。針對不同的場景,我們可以動態地調整壓縮比例,控制壓縮質量,從而實現圖片的高效處理。