- 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>"
Только что "родил": нахождение среднего цвета на картинке для собственных нужд. Поскольку пхп я особо не знал никогда, делал "влом".
Претендует ли это на звание говнокода?
1_and_0 17.09.2010 18:31 # +1
Мекор: мсье знает толк в извращениях
Литьен: не без этого
© Bash.org.ru
user654321 17.09.2010 18:48 # 0
7ion 17.09.2010 19:03 # 0
Если пишете для других - пишите комментарии, даже если код довольно понятен, как здесь.
Любите одинарные кавычки, двойные - моветон.
Конкатенацию принято оформлять с пробелами: $var . $var2
> if ($r != "255" && $g != "255" && $b != "255") {
И я не совсем понял - почему вы не любите белый цвет?
И почему вы сравниваете значение цвета со строкой? Корректно if ($r != 255 и т.д.
Вообще, код выдает в вас паскалиста. Я угадал?
Cr@ZyBoY 17.09.2010 19:29 # 0
С оформлением я особо не заморачивался, опять же, потому что только для себя.
Белый цвет отсеивал, потому что изображения на белом фоне - зачем мне лишний цвет?
На паскале последний раз программировал 3 года назад, а так я больше по JavaScript...
metaball 17.09.2010 21:14 # −3
надо так:
(!($r == "255" && $g == "255" && $b == "255"))
или так:
($r != "255" || $g != "255" || $b != "255")
metaball 17.09.2010 21:20 # +1
Cr@ZyBoY 17.09.2010 22:20 # +1
morbidlizard 18.09.2010 15:24 # 0
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
Cr@ZyBoY 18.09.2010 19:17 # 0
HoBorogHuu_nemyx 02.01.2019 22:20 # 0
metaball 18.09.2010 20:03 # +1
если красный не равен 255
И зелёный не равен 255
И красный не равен 255
то распихаем их по своим массивам
0xFF0000 (это не белый если что) - проверку НЕ проходит и по массивам не распихивается
bober_maniac 17.09.2010 21:33 # +5
Нафига срать в память массивами? Нахождение среднего для 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
И так далее по тому же принципу.
da4ever 18.09.2010 00:22 # −3
но только делать это придется в два прохода. сначала считаем белые пиксели, потом вычитаем их количество из тотала, а потом быстренько по вавшему алгоритму обходим всю картинку еще раз, деля цвет компонента на небелый тотал.
прямо чувствую как скорость выполнения возрастает в разы на коллекции из полутысячи двенадцатимегапиксельных фоток.
bober_maniac 18.09.2010 10:09 # +5
Зачем вторая проходка?
Ах, да, вы же быдлокодер... тогда да, нужна вторая. И по проходке для каждого компонента отдельно.
da4ever 18.09.2010 12:05 # −3