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

PHP 縮略圖生成類:基於 GD 庫的圖片等比縮放與裁剪實現

     編輯:PHP 相關知識

簡介

在 Web 開發中,圖片縮略圖的生成是常見需求。本文介紹一個基於 PHP GD 庫封裝的 image 類,提供兩種核心功能:等比縮放 與 等比裁剪縮略圖,適用於頭像、商品圖等場景。

類功能概覽

  • resize():按比例縮放,保證圖片完整顯示在目標尺寸內,不裁剪。
  • thumb():按比例裁剪,填滿目標尺寸,超出部分居中裁剪,適合固定比例縮略圖。

使用示例

<?php
require_once 'image.class.php';

$img = new image();

// 等比縮放:目標 300x400,源圖完整縮放
$img->resize('dstimg.jpg', 'srcimg.jpg', 300, 400);

// 等比裁剪縮略圖:目標 300x300,居中裁剪
$img->thumb('dstimg.jpg', 'srcimg.jpg', 300, 300);
?>

核心代碼實現

<?php
class image {
    // 等比縮放
    public function resize($dstImg, $srcImg, $dstW, $dstH) {
        list($srcW, $srcH) = getimagesize($srcImg);
        $scale = min($dstW / $srcW, $dstH / $srcH);
        $newW = round($srcW * $scale);
        $newH = round($srcH * $scale);

        $newImg = imagecreatetruecolor($newW, $newH);
        $srcImgRes = imagecreatefromjpeg($srcImg);
        imagecopyresampled($newImg, $srcImgRes, 0, 0, 0, 0, $newW, $newH, $srcW, $srcH);
        imagejpeg($newImg, $dstImg);
    }

    // 等比裁剪縮略圖
    public function thumb($dstImg, $srcImg, $dstW, $dstH) {
        list($srcW, $srcH) = getimagesize($srcImg);
        $scale = max($dstW / $srcW, $dstH / $srcH);
        $newW = round($dstW / $scale);
        $newH = round($dstH / $scale);
        $x = ($srcW - $newW) / 2;
        $y = ($srcH - $newH) / 2;

        $newImg = imagecreatetruecolor($dstW, $dstH);
        $srcImgRes = imagecreatefromjpeg($srcImg);
        imagecopyresampled($newImg, $srcImgRes, 0, 0, $x, $y, $dstW, $dstH, $newW, $newH);
        imagejpeg($newImg, $dstImg);
    }
}
?>

多格式支持擴展

以上代碼僅支持 JPEG。實際項目中需根據 MIME 類型動態調用對應的 imagecreatefrom* 函數:

function createFromType($type, $srcImg) {
    $function = "imagecreatefrom$type";
    return $function($srcImg);
}

// 使用示例
$mime = mime_content_type($srcImg); // 如 image/png, image/gif
$type = substr($mime, 6); // png, gif, jpeg
$srcRes = createFromType($type, $srcImg);

進階建議:使用 Imagick

若服務器安裝了 ImageMagick 擴展,強烈建議改用 Imagick 類。只需兩行代碼即可實現上述所有功能,且支持更多格式、性能更優、API 更豐富:

$imagick = new Imagick('srcimg.jpg');
$imagick->thumbnailImage(300, 400, true, true); // 等比縮放
$imagick->writeImage('dstimg.jpg');

總結

本類為 GD 庫底層操作的輕量封裝,適合無法安裝擴展的環境。生產環境推薦使用 Imagick 或成熟庫(如 Intervention Image),獲得更好的異常處理、格式支持與維護性。

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