- 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
И так далее по тому же принципу.
но только делать это придется в два прохода. сначала считаем белые пиксели, потом вычитаем их количество из тотала, а потом быстренько по вавшему алгоритму обходим всю картинку еще раз, деля цвет компонента на небелый тотал.
прямо чувствую как скорость выполнения возрастает в разы на коллекции из полутысячи двенадцатимегапиксельных фоток.
Зачем вторая проходка?
Ах, да, вы же быдлокодер... тогда да, нужна вторая. И по проходке для каждого компонента отдельно.