ThinkPHP 內建 Image 類別位於 ThinkPHP/Extend/Library/ORG/Util/Image.class.php,使用 import 載入:
<?php
import('ORG.Util.Image');
$img = new Image();
$imagePath = './Uploads/photo.jpg'; // 相對於入口檔案
$info = $img::getImageInfo($imagePath);
// 回傳陣列:width, height, type, size, mime 等
var_dump($info);
/*
array(5) {
'width' => int(800)
'height' => int(600)
'type' => int(2) // 1=GIF, 2=JPG, 3=PNG, 4=SWF
'size' => int(45231)
'mime' => 'image/jpeg'
}
*/
/**
* 產生縮圖
* @param string $srcPath 原圖路徑
* @param string $savePath 縮圖儲存路徑(含檔名)
* @param string $type 圖片類型:jpg, png, gif...
* @param int $maxW 最大寬度
* @param int $maxH 最大高度
* @return bool
*/
$ok = $img::thumb2($imagePath, './Uploads/thumb_photo.jpg', 'jpg', 300, 200);
if ($ok) {
echo '縮圖產生成功';
} else {
echo '失敗:縮圖尺寸不可大於原圖';
}
$maxW > 原寬 或 $maxH > 原高,thumb2 會回傳 false。需先檢查原圖尺寸。./ 為入口檔(通常是 index.php)所在目錄,非專案根目錄。chmod 755 或 www-data 擁有)。function smartThumb($src, $dest, $maxW, $maxH) {
import('ORG.Util.Image');
$img = new Image();
$info = $img::getImageInfo($src);
if (!$info) return false;
// 計算等比例尺寸
$ratio = min($maxW / $info['width'], $maxH / $info['height']);
if ($ratio >= 1) return false; // 無需縮小
$newW = (int)($info['width'] * $ratio);
$newH = (int)($info['height'] * $ratio);
return $img::thumb2($src, $dest, image_type_to_extension($info['type'], false), $newW, $newH);
}
// 使用:長邊不超過 300px
smartThumb('./photo.jpg', './thumb.jpg', 300, 300);
| 現象 | 原因 | 解決 |
|---|---|---|
| thumb2 回傳 false | 目標尺寸大於原圖 | 先檢查尺寸或使用等比例計算 |
| Call to undefined method | 未正確 import 類別 | 確認 import('ORG.Util.Image') 路徑正確 |
| 縮圖模糊/失真 | GD 版本或參數問題 | 檢查 GD 資訊,嘗試調整品質參數 |
| 無法讀取原圖 | 路徑錯誤或權限不足 | 使用絕對路徑,確認目錄可讀 |
ThinkPHP 3.2 起 Image 類別移至 Think\Image,支援鏈式操作與更多功能(水印、裁切、旋轉):
use Think\Image;
$image = new Image();
$image->open('./photo.jpg')
->thumb(300, 200, Image::THUMB_CENTER) // 多種裁切模式
->water('./logo.png', Image::WATER_SOUTHEAST)
->save('./result.jpg');
舊專案維護請參考本文;新專案建議升級至 ThinkPHP 5.0+ 或 Laravel,享受更現代的影像處理套件(如 intervention/image)。