傳統遍歷像素點統計 RGB 出現次數效率低且不精準。利用 Imagick quantizeImage() 降色至指定調色盤,再配合 uniqueImageColors() 取得代表色,可高效提取圖片主色調。
<?php
$average = new Imagick("xiaocai.jpg");
// 1. 降色至 10 色 RGB 空間,不抖動
$average->quantizeImage(10, Imagick::COLORSPACE_RGB, 0, false, false);
// 2. 合併相近顏色,保留唯一代表色
$average->uniqueImageColors();
// 3. 遍歷像素迭代器取得顏色陣列
function GetImagesColor(Imagick $im) {
$colorarr = array();
$it = $im->getPixelIterator();
$it->resetIterator();
while ($row = $it->getNextIteratorRow()) {
foreach ($row as $pixel) {
$colorarr[] = $pixel->getColor(); // 返回 ['r'=>..., 'g'=>..., 'b'=>..., 'a'=>...]
}
}
return $colorarr;
}
$colors = GetImagesColor($average);
// 4. 輸出色塊預覽
foreach ($colors as $val) {
printf(
'<div style="background-color: rgb(%d,%d,%d); width:50px; height:50px; float:left; margin:2px;" title="RGB(%d,%d,%d)"></div>',
$val['r'], $val['g'], $val['b'],
$val['r'], $val['g'], $val['b']
);
}
?>
| 方法 | 作用 |
|---|---|
quantizeImage($colors, $colorspace, $treedepth, $dither, $measureError) | 將圖片減色至 $colors 個顏色。$treedepth=0 讓 Imagick 自動決定。$dither=false 禁用抖動保持色塊純淨 |
uniqueImageColors() | 移除重複/極相似顏色,只保留唯一代表色 |
getPixelIterator() | 返回像素迭代器,逐行逐像素高效遍歷,避免載入整圖到記憶體 |
function getDominantColor($imagePath, $paletteSize = 5) {
$im = new Imagick($imagePath);
$im->quantizeImage($paletteSize, Imagick::COLORSPACE_RGB, 0, false, false);
$im->uniqueImageColors();
$histogram = $im->getImageHistogram(); // 顏色頻率直方圖
$maxCount = 0;
$dominant = ['r'=>0,'g'=>0,'b'=>0];
foreach ($histogram as $pixel) {
$color = $pixel->getColor();
$count = $pixel->getColorCount();
if ($count > $maxCount) {
$maxCount = $count;
$dominant = $color;
}
}
return $dominant; // 含 r,g,b,a
}
imagick 擴展 (非 ImageMagick CLI)pecl install imagick 或 yum/apt install php-imagick