За последние 24 часа нас посетили 20312 программистов и 1012 роботов. Сейчас ищут 430 программистов ...

[РЕШЕНО] Куплю скрипт

Тема в разделе "PHP для профи", создана пользователем artoodetoo, 9 дек 2017.

  1. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Синий с желтым дадут зеленый только в CMY, а не в RGB. Вас не удивит ведь тот факт, что красный с зеленым в RGB дают желтый.
    Если дать смещение в сторону зеленого - тогда и получится зеленоватый оттенок (#0088FF + #FFFF00):
    [​IMG]

    При ресемплинге получится что-то типа #88CC88
    Gimp показал цвет #80c080
     
    #76 Maputo, 20 дек 2017
    Последнее редактирование: 20 дек 2017
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Можно не уменьшать картинку, а просто делать репрезентативную выборку пикселей по всей площади!
    Я придумал выбирать N пикселей по случайным координатам. Когда n = 5000, функция дает стабильный топ-10 для реальных фоток. По-прежнему, опирается на собственные 256 оттенков.
    Размер фото больше не важен! Скрипт отрабатывает менее, чем за 5 секунд!
    В общем, записал свои идеи в одну функцию и готов передать права на неё за $20, если пригодится.

    PHP:
    1. <?php
    2. // (c) 2017 www.vasya.pro
    3. /**
    4. *
    5. * @param string $path путь к картинке
    6. * @param int $count количество цветов в результате
    7. * @param type $magic число анализируемых пикселей
    8. * @return array целочисленный индекс цвета => процент
    9. */
    10. function getColorsProportions($path, $count = 10, $magic = 5000) {
    11.   $data = file_get_contents($path);
    12.   $image = imagecreatefromstring($data);
    13.   unset($data);
    14.   $w = imagesx($image);
    15.   $h = imagesy($image);
    16.   $sq = $w * $h;
    17.   $colorats = [];
    18.   for ($i = 0; $i < $magic; $i ++) {
    19.     $pix = mt_rand(0, $sq);
    20.     $y = (int) ($pix / $w);
    21.     $x = $pix - $y * $w;
    22.     $colorats[] = imagecolorat($image, $x, $y);
    23.   }
    24.   imagedestroy($image);
    25.   $palette = [];
    26.   for ($ir = 255; $ir >= 0; $ir -= 51) {
    27.     for ($ig = 255; $ig >= 0; $ig -= 51) {
    28.       for ($ib = 255; $ib >= 0; $ib -= 51) {
    29.         if ($ir === $ig && $ig === $ib) {
    30.           continue;
    31.         }
    32.         $palette[] = ($ir << 16) + ($ig << 8) + $ib;
    33.       }
    34.     }
    35.   }
    36.   for ($i = 0; $i <= 46; $i++) {
    37.     $index = $i * 5.666666666666667;
    38.     $palette[] = ($index << 16) + ($index << 8) + $index;
    39.   }
    40.   $getColor = function($ic, $palette) {
    41.     $r1 = ($ic >> 16) & 0xFF;
    42.     $g1 = ($ic >> 8) & 0xFF;
    43.     $b1 = $ic & 0xFF;
    44.     $distance = PHP_INT_MAX;
    45.     foreach ($palette as $bc) {
    46.       $r2 = ($bc >> 16) & 0xFF;
    47.       $g2 = ($bc >> 8) & 0xFF;
    48.       $b2 = $bc & 0xFF;
    49.       $dist = sqrt(pow($r1 - $r2, 2) + pow($g1 - $g2, 2) + pow($b1 - $b2, 2));
    50.       if ($dist < $distance) {
    51.         $distance = $dist;
    52.         $color = $bc;
    53.       }
    54.     }
    55.     return $color;
    56.   };
    57.   $scores = [];
    58.   foreach ($colorats as $ic) {
    59.     $color = $getColor($ic, $palette);
    60.     if (!isset($scores[$color])) {
    61.       $scores[$color] = 0;
    62.     }
    63.     $scores[$color] ++;
    64.   }
    65.   arsort($scores);
    66.   $palette = array_keys(array_slice($scores, 0, $count, true));
    67.   $total = [];
    68.   foreach ($scores as $ic => $score) {
    69.     $color = $getColor($ic, $palette);
    70.     if (!isset($total[$color])) {
    71.       $total[$color] = 0;
    72.     }
    73.     $total[$color] += $score;
    74.   }
    75.   arsort($total);
    76.   $sum = array_sum($total);
    77.   $percents = [];
    78.   foreach ($total as $color => $score) {
    79.     $percents[$color] = (100 / $sum) * $score;
    80.   }
    81.   return $percents;
    82. }
    83.  
    84.  
    85. /* TEST */
    86. echo '<pre>';
    87. $start = microtime(1);
    88. $res = getColorsProportions('image.jpg', 11);
    89. echo round((microtime(1) - $start), 3);
    90. foreach ($res as $rgb => $size) {
    91.   $size = round($size * 10);
    92.   $r = ($rgb >> 16) & 0xFF;
    93.   $g = ($rgb >> 8) & 0xFF;
    94.   $b = $rgb & 0xFF;
    95.   echo '<div style="float: left; width: ' . $size . 'px; height: ' . $size . 'px;'
    96.       . ' background-color:rgb(' . $r . ',' . $g . ',' . $b . ');"></div>';
    97. }
    --- Добавлено ---
    На этом мой творческий потенциал в этой задаче исчерпан =)
     
    artoodetoo нравится это.
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Бл#, желтый с синим дают серый в RGB реально))
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    я изложил свои мысли - масштабирование само смешает цвета и сделает это на низкоуровневых библиотеках, а не на PHP,
    --- Добавлено ---
    спасибо! буду изучать когда работа немного отпустит меня :)
     
  5. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    @artoodetoo расскажи, как дела)
    занимаешься своей идеей?
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    нет, к сожалению. :( это требует времени и "переключения контекста". пока есть более приоритетные задачи
     
  7. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Если вдруг займешься - отпишись плз) интересно)
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    конечно.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    приз получает [vs]
    когда дойдёт до реализации, ссылками поделюсь.
     
  10. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Я могу написать, но не уверен, что ты умеешь читать ;)
     
  12. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Первый раз вижу тему с пометкой [Решено]
     
  13. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    :D