分析圖片主色調常用於縮圖邊框、背景色自動適配、視覺化分類等場景。最直觀的方法是遍歷所有像素,累加 RGB 三通道數值並取平均。本文提供完整 PHP 實作碼與優化建議。
<?php
$imagePath = "photo3.jpg"; // 請確保路徑正確
$img = imagecreatefromjpeg($imagePath);
if (!$img) die("無法載入圖片");
$width = imagesx($img);
$height = imagesy($img);
$rTotal = $gTotal = $bTotal = 0;
$total = 0;
for ($x = 0; $x < $width; $x++) {
for ($y = 0; $y < $height; $y++) {
$rgb = imagecolorat($img, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$rTotal += $r;
$gTotal += $g;
$bTotal += $b;
$total++;
}
}
$rAvg = round($rTotal / $total);
$gAvg = round($gTotal / $total);
$bAvg = round($bTotal / $total);
echo "平均顏色 RGB: ($rAvg, $gAvg, $bAvg)";
echo "<br>十六進位: #" . sprintf("%02x%02x%02x", $rAvg, $gAvg, $bAvg);
imagedestroy($img);
imagescale() 縮小至 100x100 像素,大幅減少迴圈次數,誤差極小。exec("convert image.jpg -resize 1x1 txt:-") 可直接取得單像素平均色,速度極快。imagecolorstotal() 配合調色盤模式可避免逐像素操作,但僅適用 256 色圖片。$hex = sprintf("#%02x%02x%02x", $rAvg, $gAvg, $bAvg);
echo ":root { --image-dominant-color: $hex; }";
逐像素掃描雖簡單易懂,但對大圖效能較差。實務上建議結合縮圖或取樣策略,或直接呼叫 ImageMagick 以獲得最佳效能與準確度。