Искажённая captcha.

(Ответов: 0, Просмотров: 481)
  1. Новичок
    • Регистрация: 13.02.2012
    • Сообщений: 20
    • Репутация: 0
    Здравствуйте, сейчас учусь делать капчу. Вот нашёл исходник но мне тут не всё понятно, пожалуйста, кому не сложно, максимально закомментируйте код. Сдесь описан алгоритм скручивания изображения.
    Нажмите на изображение для увеличения.  Название:	1e025f57.gif  Просмотров:	2  Размер:	9.4 Кб  ID:	3933
    Нажмите на изображение для увеличения.  Название:	before.png  Просмотров:	3  Размер:	2.0 Кб  ID:	3934 ====>>> Нажмите на изображение для увеличения.  Название:	after.png  Просмотров:	2  Размер:	4.6 Кб  ID:	3935

    Развернуть текст

    Код:
    //$img — изображение-первообраз, $img2 — результат искажения
    // случайные параметры (можно поэкспериментировать с коэффициентами):
    // частоты
    $rand1 = mt_rand(700000, 1000000) / 15000000;
    $rand2 = mt_rand(700000, 1000000) / 15000000;
    $rand3 = mt_rand(700000, 1000000) / 15000000;
    $rand4 = mt_rand(700000, 1000000) / 15000000;
    // фазы
    $rand5 = mt_rand(0, 3141592) / 1000000;
    $rand6 = mt_rand(0, 3141592) / 1000000;
    $rand7 = mt_rand(0, 3141592) / 1000000;
    $rand8 = mt_rand(0, 3141592) / 1000000;
    // амплитуды
    $rand9 = mt_rand(400, 600) / 100;
    $rand10 = mt_rand(400, 600) / 100;
     
    for($x = 0; $x < $width; $x++){
      for($y = 0; $y < $height; $y++){
        // координаты пикселя-первообраза.
        $sx = $x + ( sin($x * $rand1 + $rand5) + sin($y * $rand3 + $rand6) ) * $rand9;
        $sy = $y + ( sin($x * $rand2 + $rand7) + sin($y * $rand4 + $rand8) ) * $rand10;
     
        // первообраз за пределами изображения
        if($sx < 0 || $sy < 0 || $sx >= $width - 1 || $sy >= $height - 1){ 
          $color = 255;
          $color_x = 255;
          $color_y = 255;
          $color_xy = 255;
        }else{ // цвета основного пикселя и его 3-х соседей для лучшего антиалиасинга
          $color = (imagecolorat($img, $sx, $sy) >> 16) & 0xFF;
          $color_x = (imagecolorat($img, $sx + 1, $sy) >> 16) & 0xFF;
          $color_y = (imagecolorat($img, $sx, $sy + 1) >> 16) & 0xFF;
          $color_xy = (imagecolorat($img, $sx + 1, $sy + 1) >> 16) & 0xFF;
        }
    
    
    
        // сглаживаем только точки, цвета соседей которых отличается
        if($color == $color_x && $color == $color_y && $color == $color_xy){
          $newcolor=$color;
        }else{
          $frsx = $sx - floor($sx); //отклонение координат первообраза от целого
          $frsy = $sy - floor($sy);
          $frsx1 = 1 - $frsx;
          $frsy1 = 1 - $frsy;
    
          // вычисление цвета нового пикселя как пропорции от цвета основного пикселя и его соседей
          $newcolor = floor( $color    * $frsx1 * $frsy1 +
                             $color_x  * $frsx  * $frsy1 +
                             $color_y  * $frsx1 * $frsy  +
                             $color_xy * $frsx  * $frsy );
        }
        imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newcolor, $newcolor, $newcolor));
      }
    }
    [свернуть]

    Посоветуйте ещё источники где подробно описан алгоритм для создания такой капчи.
    Для тех кто напишет: "Проще взять готовую, чем самому писать", "Капчи уже бесполезны не используй их". Отвечаю: мне интересно разобраться и понять код, а использовать мне готовую или писать самому, я уже разберусь сам.
    Последний раз редактировалось na9ort; 06.04.2012 в 03:54.
    • 0

Похожие темы

Темы Раздел Ответов Последний пост
Все, что вы хотели знать о CAPTCHA. Кто за гроши делает грязную работу
Дайджест блогосферы 0 20.09.2010 01:16
Русифицированный плагин”AJAX FANCY CAPTCHA”
Дайджест блогосферы 1 19.04.2010 09:45
Jquery Captcha
Дайджест блогосферы 0 15.04.2010 23:35
Вас достал cпам? Умный плагин от cпама для WordPress – Shelvin Time Captcha!
Дайджест блогосферы 8 27.01.2010 10:33

У кого попросить инвайт?

Вы можете попросить инвайт у любого модератора:

Информеры