用 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 玩轉圖片:縮放、裁剪、水印、濾鏡一網打盡