博客 / 詳情

返回

用 PHP 玩轉圖片:縮放、裁剪、水印、濾鏡一網打盡

用 PHP 玩轉圖片:縮放、裁剪、水印、濾鏡一網打盡

提到 PHP 和圖像,你會想到什麼?大概是上傳一張圖片到網站,然後收工。但 PHP 可不只是個上傳工具——它在圖像處理方面藏着不少本事。

圖片太大放不下網頁?需要裁掉背景裏那個亂入的路人?PHP 都能搞定。無論是縮放、裁剪、加水印,還是像 Instagram 那樣加濾鏡,PHP 都能勝任。

這篇文章會帶你瞭解 PHP 圖像處理的更多玩法。我們會深入 GD 庫,順便聊聊 Imagick。

GD 和 Imagick:兩大圖像處理庫

在動手之前,先介紹兩個核心工具:GD 庫和 Imagick。

GD 庫:穩定可靠的老夥計

PHP 內置的 GD 庫是個經典選擇,適合處理基礎的圖像操作:縮放、裁剪、添加文字。它默認就在 PHP 裏,不用額外安裝。雖然不是最炫的,但夠用、穩定。

Imagick:功能更強的新選擇

Imagick 是另一個圖像處理庫,功能更強大。它擅長處理矢量圖、應用特效、支持更多格式。如果你需要做複雜的圖像處理,Imagick 是更好的選擇。不過本文主要用 GD 庫來演示。

基礎:圖像上傳

在處理圖像之前,得先把它上傳到服務器。下面是一個基礎的上傳腳本:

if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['image'])) {
    $image = $_FILES['image'];
    $uploadDir = 'uploads/';
    $uploadFile = $uploadDir . basename($image['name']);
    
    if (move_uploaded_file($image['tmp_name'], $uploadFile)) {
        echo 'Image uploaded successfully!';
    } else {
        echo 'Failed to upload image.';
    }
}

這段代碼把上傳的圖片移動到指定目錄,接下來就可以開始處理了。

使用 GD 庫處理圖像

上傳搞定了,現在進入正題——圖像處理。

縮放圖像

圖片太大會拖慢頁面加載速度。用 GD 庫可以輕鬆縮放:

function resizeImage($source, $target, $width, $height) {
    list($originalWidth, $originalHeight) = getimagesize($source);
    $image = imagecreatefromjpeg($source);
    
    $newImage = imagecreatetruecolor($width, $height);
    imagecopyresized($newImage, $image, 0, 0, 0, 0, $width, $height, $originalWidth, $originalHeight);
    
    imagejpeg($newImage, $target);
    imagedestroy($image);
    imagedestroy($newImage);
}

這個函數把圖像縮放到指定的寬高,適合在展示前調整圖片尺寸。

裁剪圖像

需要裁掉圖片的某個區域?用 imagecrop() 函數:

function cropImage($source, $target, $x, $y, $width, $height) {
    list($originalWidth, $originalHeight) = getimagesize($source);
    $image = imagecreatefromjpeg($source);
    
    $croppedImage = imagecrop($image, ['x' => $x, 'y' => $y, 'width' => $width, 'height' => $height]);
    
    if ($croppedImage !== FALSE) {
        imagejpeg($croppedImage, $target);
        imagedestroy($croppedImage);
    }
    imagedestroy($image);
}

指定裁剪區域的座標和尺寸,PHP 會幫你完成剩下的工作。

添加水印

如果你運營一個允許用户上傳圖片的網站,給圖片加水印可以防止盜用。下面是添加水印的方法:

function addWatermark($imagePath, $watermarkPath, $targetPath) {
    $image = imagecreatefromjpeg($imagePath);
    $watermark = imagecreatefrompng($watermarkPath);
    
    $imageWidth = imagesx($image);
    $imageHeight = imagesy($image);
    $watermarkWidth = imagesx($watermark);
    $watermarkHeight = imagesy($watermark);
    
    // 水印放在右下角
    $destX = $imageWidth - $watermarkWidth - 10;
    $destY = $imageHeight - $watermarkHeight - 10;
    
    imagecopy($image, $watermark, $destX, $destY, 0, 0, $watermarkWidth, $watermarkHeight);
    
    imagejpeg($image, $targetPath);
    imagedestroy($image);
    imagedestroy($watermark);
}

這個函數把 PNG 格式的水印疊加到圖片右下角。

進階:濾鏡和縮略圖

掌握了基礎操作,來看看更高級的玩法。

應用濾鏡

GD 庫支持給圖像添加濾鏡。比如把圖片轉成灰度:

function applyGrayscale($imagePath, $targetPath) {
    $image = imagecreatefromjpeg($imagePath);
    
    imagefilter($image, IMG_FILTER_GRAYSCALE);
    
    imagejpeg($image, $targetPath);
    imagedestroy($image);
}

除了灰度,還可以調整亮度、對比度,甚至做像素化效果。

生成縮略圖

在圖片庫或商品列表中,縮略圖是必不可少的。下面是生成縮略圖的函數:

function createThumbnail($source, $target, $thumbWidth) {
    list($originalWidth, $originalHeight) = getimagesize($source);
    $thumbHeight = ($thumbWidth / $originalWidth) * $originalHeight;
    
    $image = imagecreatefromjpeg($source);
    $thumb = imagecreatetruecolor($thumbWidth, $thumbHeight);
    
    imagecopyresized($thumb, $image, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $originalWidth, $originalHeight);
    
    imagejpeg($thumb, $target);
    imagedestroy($image);
    imagedestroy($thumb);
}

這個函數按指定寬度生成縮略圖,同時保持原圖的寬高比。

常見問題排查

圖像處理有時會遇到一些問題,這裏列出幾個常見的。

圖像損壞

如果 PHP 無法正確處理圖像文件,可能會導致損壞。處理前先用 getimagesize() 驗證文件是否為有效圖像,同時確認文件格式(JPEG、PNG、GIF)。

內存不足

處理大圖片時可能會遇到內存限制。可以在 php.ini 中調整 memory_limit。如果是共享主機,可能需要聯繫服務商提升配額。

總結

PHP 的圖像處理能力遠不止上傳那麼簡單。藉助 GD 和 Imagick,你可以完成縮放、裁剪、加水印、應用濾鏡等操作。無論是搭建圖片庫、處理用户上傳的內容,還是優化網站圖片,這些技能都能派上用場。
用 PHP 玩轉圖片:縮放、裁剪、水印、濾鏡一網打盡

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.