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

PHP getimagesize 取得圖片與 SWF 尺寸資訊

     編輯:PHP 綜合知識

函數原型

getimagesize(string $filename, array &$imageinfo = null): array|false

回傳陣列結構

索引鍵名說明
0width寬度 (像素)
1height高度 (像素)
2type圖片類型常數 (IMAGETYPE_JPEG=2 等)
3html可直接用於 `` 的 `width="..." height="..."` 字串
bits色深 (bits per pixel)
channels通道數 (3=RGB, 4=RGBA/CMYK)
mimeMIME 類型 (image/jpeg, image/png...)

支援格式

GIF, JPG, PNG, SWF, SWC, PSD, TIFF, BMP, IFF, JP2, JPX, JB2, JPC, XBM, WBMP, WebP (PHP 7.0+), AVIF (PHP 8.1+)

基本用法

<?php
// 本地檔案
$info = getimagesize('/var/www/uploads/photo.jpg');
if ($info) {
    echo "寬: {$info[0]}, 高: {$info[1]}, MIME: {$info['mime']}";
    // 直接用於 img 標籤
    echo '';
}

// 遠端 URL (需 allow_url_fopen=On)
$info = @getimagesize('https://example.com/image.png');
if ($info === false) {
    echo '無法讀取遠端圖片';
}
?>

進階:第二參數取得額外資訊 (JPEG APP 標記)

<?php
$imageInfo = [];
$size = getimagesize('photo.jpg', $imageInfo);

if ($size && isset($imageInfo['APP1'])) {
    // APP1 通常包含 Exif 資料
    $exif = $imageInfo['APP1'];
    // 解析 Exif 需額外邏輯或用 exif_read_data()
}
?>

常見應用場景

上傳驗證:檢查尺寸與類型

<?php
function validateImageUpload($tmpPath, $maxWidth = 2000, $maxHeight = 2000)
{
    $info = @getimagesize($tmpPath);
    if (!$info) {
        return ['valid' => false, 'error' => '非有效圖片檔案'];
    }

    // MIME 白名單
    $allowedMimes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
    if (!in_array($info['mime'], $allowedMimes, true)) {
        return ['valid' => false, 'error' => '不支援的圖片格式'];
    }

    // 尺寸限制
    if ($info[0] > $maxWidth || $info[1] > $maxHeight) {
        return ['valid' => false, 'error' => "圖片尺寸超過限制 ({$maxWidth}x{$maxHeight})"];
    }

    // 檔案大小另行檢查 (getimagesize 不回傳檔案大小)
    return ['valid' => true, 'info' => $info];
}
?>

動態縮圖:依原圖比例計算目標尺寸

<?php
function calculateResize($srcW, $srcH, $maxW, $maxH)
{
    $ratio = min($maxW / $srcW, $maxH / $srcH);
    if ($ratio >= 1) return ['w' => $srcW, 'h' => $srcH]; // 無需縮小

    return [
        'w' => (int)round($srcW * $ratio),
        'h' => (int)round($srcH * $ratio),
    ];
}

// 使用
$info = getimagesize($source);
$target = calculateResize($info[0], $info[1], 800, 600);
// 交給 GD/Imagick 縮放
?>

SWF/Flash 尺寸讀取 (歷史專案維護)

<?php
// getimagesize 直接支援 SWF
$info = getimagesize('animation.swf');
if ($info && $info[2] === IMAGETYPE_SWF) {
    echo "Flash 尺寸: {$info[0]}x{$info[1]}";
    // 注意:SWF 可能為向量動畫,尺寸僅代表舞台大小
}
?>

效能與替代方案

方法優點缺點適用場景
getimagesize()內建、支援 URL、回傳豐富資訊需讀取檔案頭部、大檔/遠端較慢一般上傳驗證、中小型專案
getimagesizefromstring()從字串/記憶體讀取、避免臨時檔需先載入完整檔案到記憶體S3/資料庫 Blob 直讀
exif_read_data()完整 Exif 解析 (GPS、相機參數等)僅支援 JPEG/TIFF、較慢需攝影資訊時
Imagick::pingImage()極快、僅讀取頭部、支援超大檔需安裝擴充套件高併發、大量圖片處理

錯誤處理模式

<?php
function safeGetImageSize($path)
{
    // 抑制警告,統一回傳 false
    $info = @getimagesize($path);
    
    if ($info === false) {
        $error = error_get_last();
        error_log("getimagesize failed for $path: " . ($error['message'] ?? 'unknown'));
        return null;
    }
    
    return $info;
}
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved