2011-08-05 402 views
6

我試圖在php中獲取圖像的RGB顏色的平均值。圖像的RGB顏色的平均值

由GD庫我對其編程

$x = imagesx($im); 
    $y = imagesy($im); 
    for ($i = 0;$i < $x;$i++) 
     for ($j = 0;$j < $y;$j++){ 
      $rgb = imagecolorat($im,$i,$j); 
      $sum['R'] += ($rgb >> 16) & 0xFF; 
      $sum['G'] += ($rgb >> 8) & 0xFF; 
      $sum['B'] += $rgb & 0xFF; 
     } 

但它不是好辦法,我認爲。它需要大量內存來處理。還有另一種方法可以做到嗎?

+2

將圖像調整爲1px x 1px用於給出良好的平均值 – Willian

+2

@William:可能取決於使用的縮放算法。 ;) – FrustratedWithFormsDesigner

回答

5

我會去與重採樣:

$tmp_img = ImageCreateTrueColor(1,1); 
ImageCopyResampled($tmp_img,$im,0,0,0,0,1,1,$x,$y); // or ImageCopyResized 
$rgb = ImageColorAt($tmp_img,0,0); 
+2

什麼是默認重採樣算法?我希望這不是最近的鄰居。 –

3

的一種方式做,這是對畫面比例只是一個像素,然後使用該像素的顏色作爲參考。

<?php 
$image = new Imagick('800x480.jpg'); 
$image->scaleImage(1, 1, true); 
$pixel = $image->getImagePixelColor(0,0); 

$red = ($rgb >> 16) & 0xFF; 
$green = ($rgb >> 8) & 0xFF; 
$blue = $rgb & 0xFF; 
?> 

這樣你就不需要處理凌亂的細節。您可以使用更智能的縮放算法來實現更高的精度。

編輯:如果您需要更復雜的算法,則可以使用Imagick::resizeImage。它可以使用不同的算法,如插值濾波器。

+0

在這種情況下,更智能的縮放算法並不是更好的解決方案。完美的縮放算法將所有源像素簡單地平均到目標像素。比如,雙立方就不太準確。 –

+0

是的,但它會是一個更快,更有效的算法,其價格不太準確,因爲它通常是效率的情況。 – Mehran

+1

與簡單平均相比,唯一的「更快更高效的算法」是最近鄰選擇,這是最糟糕的結果 - 它只會在圖像中心附近選取一個像素。 –