средний цвет RGB изображения - PullRequest
6 голосов
/ 06 августа 2011

Я пытаюсь получить среднее значение цвета RGB изображения в php.

от gd lib Я программирую

    $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 ]

5 голосов
/ 06 августа 2011

Я бы пошел с пересчетом:

$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);
3 голосов
/ 06 августа 2011

Один из способов сделать это - масштабировать изображение до одного пикселя, а затем использовать цвета этого пикселя в качестве эталона.

<?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 , если вам нужен более сложный алгоритм.он может использовать разные алгоритмы, такие как фильтр интерполяции.

...