2011-08-05 20 views
6

Estoy tratando de obtener el promedio de color RGB de la imagen en php.promedio de color RGB de la Imagen

por lib gd que programarlo

$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; 
     } 

pero no es una buena forma de pensar. Necesita una gran cantidad de ram para procesar. ¿Hay alguna otra forma de hacerlo?

+2

Cambiando el tamaño de la imagen a 1px x 1px para dar un buen promedio – Willian

+2

@William: Puede depender del algoritmo de escala que se use. ;) – FrustratedWithFormsDesigner

Respuesta

5

Me gustaría ir con remuestreo:

$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

¿Cuál es el algoritmo de remuestreo predeterminado? Espero que no sea el vecino más cercano. –

3

Una forma de hacer esto es para escalar la imagen a un solo píxel y luego usar los colores de ese píxel como referencia.

<?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; 
?> 

De esta manera no es necesario que maneje detalles desordenados. y puede usar algoritmos de escalado más inteligentes para lograr una mejor precisión.

Editar: Puede utilizar Imagick::resizeImage en su lugar si necesita un algoritmo más sofisticado. puede usar diferentes algoritmos como filtro de interpolación.

+0

Los algoritmos de escalamiento más inteligentes no son una mejor solución en este caso. El algoritmo de escalamiento perfecto simplemente promediará todos los píxeles fuente en el píxel de destino. Bicubic por ejemplo sería menos preciso. –

+0

Sí, pero sería un algoritmo más rápido y más eficiente con el precio de ser menos preciso, como suele ser el caso con la eficiencia. – Mehran

+1

El único "algoritmo más rápido y más eficiente" que el simple promediado sería la selección del vecino más cercano, que es el peor resultado posible: simplemente elegiría un píxel cerca del centro de la imagen. –

Cuestiones relacionadas