- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 
                        $image = imageCreateFromJpeg("test666.jpg");
$width = imageSX($image);
$height = imageSY($image);
$colorsR = array();
$colorsG = array();
$colorsB = array();
for ($i = 0; $i < $width; $i++) {
	for ($j = 0; $j < $height; $j++) {
		
		$color = imageColorAt($image, $i, $j);
		list($r, $g, $b) = array_values(imageColorsForIndex($image, $color));
		
		if ($r != "255" && $g != "255" && $b != "255") {
			array_push($colorsR, $r);
			array_push($colorsG, $g);
			array_push($colorsB, $b);
		}
		
	}
}
$middleR = base_convert(round(array_sum($colorsR) / count($colorsR)), 10, 16);
$middleG = base_convert(round(array_sum($colorsG) / count($colorsG)), 10, 16);
$middleB = base_convert(round(array_sum($colorsB) / count($colorsB)), 10, 16);
echo "<h1>".$middleR.$middleG.$middleB."</h1>"
                                 
        
            Только что "родил": нахождение среднего цвета на картинке для собственных нужд. Поскольку пхп я особо не знал никогда, делал "влом".
Претендует ли это на звание говнокода?
        
        
Мекор: мсье знает толк в извращениях
Литьен: не без этого
© Bash.org.ru
Если пишете для других - пишите комментарии, даже если код довольно понятен, как здесь.
Любите одинарные кавычки, двойные - моветон.
Конкатенацию принято оформлять с пробелами: $var . $var2
> if ($r != "255" && $g != "255" && $b != "255") {
И я не совсем понял - почему вы не любите белый цвет?
И почему вы сравниваете значение цвета со строкой? Корректно if ($r != 255 и т.д.
Вообще, код выдает в вас паскалиста. Я угадал?
С оформлением я особо не заморачивался, опять же, потому что только для себя.
Белый цвет отсеивал, потому что изображения на белом фоне - зачем мне лишний цвет?
На паскале последний раз программировал 3 года назад, а так я больше по JavaScript...
надо так:
(!($r == "255" && $g == "255" && $b == "255"))
или так:
($r != "255" || $g != "255" || $b != "255")
http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD%D1%8B_%D0 %B4%D0%B5_%D0%9C%D0%BE%D1%80%D0%B3%D0%B0 %D0%BD%D0%B0
если красный не равен 255
И зелёный не равен 255
И красный не равен 255
то распихаем их по своим массивам
0xFF0000 (это не белый если что) - проверку НЕ проходит и по массивам не распихивается
Нафига срать в память массивами? Нахождение среднего для i+1 чисел если известно число n и среднее для предыдущих i чисел выражается индукционной формулой mid[1] = n, mid[i+1] = (mid[i]*i+n)/(i+1), где mid -это не массив, а просто обозначение для индукционного соотношения.
Итого, имеем.
mid[1] = n[1]
mid[2] = (n[1]*1+n[2])/2 = (n[1]+n[2])/2
mid[3] = (mid[2]*2+n[3])/3 = ((n[1]+n[2])/2*2+n[3])/3 = (n[1]+n[2]+n[3])/3
И так далее по тому же принципу.
но только делать это придется в два прохода. сначала считаем белые пиксели, потом вычитаем их количество из тотала, а потом быстренько по вавшему алгоритму обходим всю картинку еще раз, деля цвет компонента на небелый тотал.
прямо чувствую как скорость выполнения возрастает в разы на коллекции из полутысячи двенадцатимегапиксельных фоток.
Зачем вторая проходка?
Ах, да, вы же быдлокодер... тогда да, нужна вторая. И по проходке для каждого компонента отдельно.