首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 圖像處理統一類庫:驗證碼、縮略圖、水印一站式解決

     編輯:PHP 相關知識

PHP 圖像處理統一類庫:驗證碼、縮略圖、水印一站式解決

封裝 GD 庫常用功能為靜態類,提供驗證碼生成、智能縮略圖、圖片水印三大核心功能,代碼緊湊、無依賴、可直接投入生產使用。

統一圖像處理類

class ImageUtil {
    // ==================== 驗證碼 ====================
    public static function captcha($charset = '0123456789', $len = 4, $w = 100, $h = 40) {
        session_start();
        $img = imagecreatetruecolor($w, $h);
        
        // 背景噪點
        for ($i = 0; $i < 200; $i++) {
            imagesetpixel($img, mt_rand(0,$w), mt_rand(0,$h), 
                imagecolorallocate($img, mt_rand(150,255), mt_rand(150,255), mt_rand(150,255)));
        }
        
        // 干擾線
        for ($i = 0; $i < 5; $i++) {
            imageline($img, mt_rand(0,$w), mt_rand(0,$h), mt_rand(0,$w), mt_rand(0,$h),
                imagecolorallocate($img, mt_rand(100,200), mt_rand(100,200), mt_rand(100,200)));
        }
        
        // 字符繪製
        $code = '';
        for ($i = 0; $i < $len; $i++) {
            $char = $charset[mt_rand(0, strlen($charset)-1)];
            $code .= $char;
            $color = imagecolorallocate($img, mt_rand(0,100), mt_rand(0,100), mt_rand(0,100));
            $size = mt_rand(16, 22);
            $x = 10 + $i * 22;
            $y = mt_rand(25, 32);
            imagestring($img, 5, $x, $y, $char, $color);  // 簡化版,生產建議用 TTF
        }
        
        $_SESSION['captcha'] = strtolower($code);
        
        header('Content-Type: image/png');
        imagepng($img);
        imagedestroy($img);
        return $code;
    }
    
    public static function verify($input) {
        return strtolower($input) === ($_SESSION['captcha'] ?? '');
    }
    
    // ==================== 縮略圖 ====================
    public static function thumbnail($srcPath, $maxW = 300, $maxH = 300, $savePath = null, $quality = 85) {
        list($srcW, $srcH, $type) = getimagesize($srcPath);
        if (!$srcW) return false;
        
        // 計算目標尺寸(保持比例)
        $ratio = min($maxW/$srcW, $maxH/$srcH);
        if ($ratio >= 1) return $srcPath;  // 無需縮放
        
        $dstW = (int)($srcW * $ratio);
        $dstH = (int)($srcH * $ratio);
        
        $create = ['imagecreatefromgif','imagecreatefromjpeg','imagecreatefrompng'][$type-1];
        $save = ['imagegif','imagejpeg','imagepng'][$type-1];
        
        $src = $create($srcPath);
        $dst = imagecreatetruecolor($dstW, $dstH);
        
        // 透明背景處理 (GIF/PNG)
        if ($type === 1 || $type === 3) {
            imagecolortransparent($dst, imagecolorallocatealpha($dst, 0,0,0,127));
            imagealphablending($dst, false);
            imagesavealpha($dst, true);
        }
        
        imagecopyresampled($dst, $src, 0,0, 0,0, $dstW,$dstH, $srcW,$srcH);
        
        $savePath = $savePath ?: dirname($srcPath) . '/thumb_' . basename($srcPath);
        $save($dst, $savePath, $quality);
        
        imagedestroy($src);
        imagedestroy($dst);
        return $savePath;
    }
    
    // ==================== 水印 ====================
    public static function watermark($dstPath, $markPath, $pos = 9, $alpha = 50, $margin = 10) {
        list($dstW, $dstH, $dstType) = getimagesize($dstPath);
        list($markW, $markH) = getimagesize($markPath);
        
        $create = ['imagecreatefromgif','imagecreatefromjpeg','imagecreatefrompng'];
        $save = ['imagegif','imagejpeg','imagepng'];
        
        $dst = $create[$dstType-1]($dstPath);
        $mark = $create[3-1]($markPath);  // 水印建議用 PNG
        
        // 位置計算 (1-9 對應九宮格)
        $positions = [
            1=>[0,0], 2=>[($dstW-$markW)/2,0], 3=>[$dstW-$markW,0],
            4=>[0,($dstH-$markH)/2], 5=>[($dstW-$markW)/2,($dstH-$markH)/2], 6=>[$dstW-$markW,($dstH-$markH)/2],
            7=>[0,$dstH-$markH], 8=>[($dstW-$markW)/2,$dstH-$markH], 9=>[$dstW-$markW,$dstH-$markH]
        ];
        [$x, $y] = $positions[$pos];
        $x += ($pos%3==1?$margin:($pos%3==0?-$margin:0));
        $y += ($pos<=3?$margin:($pos>=7?-$margin:0));
        
        imagecopymerge($dst, $mark, $x, $y, 0,0, $markW,$markH, $alpha);
        
        $save[$dstType-1]($dst, $dstPath);
        imagedestroy($dst);
        imagedestroy($mark);
        return true;
    }
}

使用示例


// captcha.php: ImageUtil::captcha('ABCDEFGHJKLMNPQRSTUVWXYZ23456789', 4);

// 2. 驗證用戶輸入
if ($_POST) {
    if (!ImageUtil::verify($_POST['captcha'])) die('驗證碼錯誤');
    // 業務邏輯...
}

// 3. 生成縮略圖
$thumb = ImageUtil::thumbnail('uploads/photo.jpg', 400, 300, 'uploads/thumb_photo.jpg');
// 返回: uploads/thumb_photo.jpg

// 4. 添加水印
ImageUtil::watermark('uploads/photo.jpg', 'assets/logo.png', 9, 30);  // 右下角 30% 透明度

功能對比與選型建議

功能GD (本類)ImageMagickIntervention/Image
安裝複雜度內置需編譯擴展Composer 安裝
性能中等高中等
格式支援基礎全面全面
API 易用性原生複雜優雅
適用場景輕量項目、無權限環境高併發、複雜處理現代框架項目

生產環境優化建議

  • 驗證碼使用 TTF 字體:imagettftext() 替代 imagestring()
  • 大圖處理啟用分塊處理或調大 memory_limit
  • 縮略圖緩存策略:文件名包含尺寸參數,避免重複生成
  • 水印位置支援平鋪模式:imagecopymerge 循環繪製
  • 統一異常處理:捕獲 GD 錯誤拋出自定義異常

這個類庫解決了 90% 的常規圖像處理需求,零依賴、零配置、即拿即用,是中小項目的最佳選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved