Искажённая captcha. - Webmasters.ru - RSS http://webmasters.ru/forum/showthread.php?t=27603 SEO форум вебмастеров - Поисковые системы, оптимизация, раскрутка сайта, оптимизация и продвижение сайта в поисковых системах 1744722220 Elesite CMS 60 http://webmasters.ru/forum/images/wm/misc/rss.png SEO форум вебмастеров Webmasters.ru http://webmasters.ru/forum Искажённая captcha. by na9ort http://webmasters.ru/forum/showpost.php?p=276368 Thu, 05 Apr 2012 22:14:17 GMT Здравствуйте, сейчас учусь делать капчу. Вот нашёл исходник но мне тут не всё понятно, пожалуйста, кому не сложно, максимально закомментируйте код. Сдесь описан алгоритм скручивания изображения. 3933 3934 ====>>> 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)); } } Посоветуйте ещё источники где подробно описан алгоритм для создания такой капчи. Для тех кто напишет: "Проще взять готовую, чем самому писать", "Капчи уже бесполезны не используй их". Отвечаю: мне интересно разобраться и понять код, а использовать мне готовую или писать самому, я уже разберусь сам. >> 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)); } } Посоветуйте ещё источники где подробно описан алгоритм для создания такой капчи. Для тех кто напишет: "Проще взять готовую, чем самому писать", "Капчи уже бесполезны не используй их". Отвечаю: мне интересно разобраться и понять код, а использовать мне готовую или писать самому, я уже разберусь сам.]]>