PHP imagecopyresampled()和imagecopyresized():圖片壓縮

2020-07-16 10:05:28
影象是網站中主要的內容展現方式之一。當我們將圖片上傳到伺服器時,為了節省儲存空間往往需要將圖片進行壓縮,同時也可以提高網頁載入的速度。壓縮通常是指將圖片按比例進行縮放,以此來減少圖片的體積。

實際開發中,一般在上傳圖片時就需要對圖片進行壓縮操作,想要壓縮圖片可以使用 imagecopyresized() 或者 imagecopyresampled() 函數,而使用 imagecopyresampled() 函數處理後圖片的品質會好一些,所以在進行圖片壓縮時可以優先使用 imagecopyresampled() 函數。

首頁來看一下這兩個函數的語法格式

imagecopyresized(resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h)
imagecopyresampled(resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h)

兩個函數的引數是完全一樣的,說明如下:
  • $dst_image:目標圖象連線資源。
  • $src_image:源圖象連線資源。
  • $dst_x:目標 X 坐標點。
  • $dst_y:目標 Y 坐標點。
  • $src_x:源的 X 坐標點。
  • $src_y:源的 Y 坐標點。
  • $dst_w:目標寬度。
  • $dst_h:目標高度。
  • $src_w:源圖象的寬度。
  • $src_h:源圖象的高度。

這兩個函數都可以將一幅影象中的一塊矩形區域拷貝到另一個影象中,而 imagecopyresampled() 函數更是可以平滑地插入畫素值,因此,在減小了影象的大小的同時仍然保持極大的清晰度。

通俗來講就是,這兩個函數可以從影象 $src_image 的($src_x,$src_y)位置,擷取一個寬 $src_w 高 $src_h 的矩形區域,並將其複製到影象 $dst_image 中($dst_x,$dst_y)處,寬 $dst_w 高 $dst_h 的矩形區域中。

如果源和目標的寬度和高度不同,則會進行相應的影象收縮和拉伸。而坐標則是指的矩形區域的左上角。另外,兩個函數都可用來在同一幅圖($dst_image 和 $src_image 相同)內部進行拷貝,但如果拷貝區域交疊的話則結果不可預知。

【範例】使用 imagecopyresampled() 函數來壓縮圖片尺寸。
<?php
    /**
     * @param  $file  要縮放的圖片路徑
     * @param  $width 縮放後的寬度
     * @param  $height縮放後的高度
     * @param  $eq    是否等比縮放
     * @return [type]
     */
    function compress($file,$width,$height='',$eq=true){
        $image = imagecreatefrompng($file);
        $img_info = getimagesize($file);
        if($eq) $height = $img_info[1]*($width/$img_info[0]);
        $com_image = imagecreatetruecolor($width, $height);
        imagecopyresampled($com_image, $image, 0, 0, 0, 0, $width, $height, $img_info[0], $img_info[1]);
        header('Content-type:image/jpeg');
        imagejpeg($com_image);
        imagedestroy($com_image);
    }
    $file = 'http://c.biancheng.net/templets/new/images/logo.png';
    compress($file,200);
?>
執行上面的程式碼,即可將圖片等比縮放到指定的寬度和高度,如下圖所示:

壓縮圖片
圖:圖片縮放後的效果