GB и немного OOP. все это хоязйство выводится так: <img src="captcha.php" /> captcha.php PHP: <? # Тигренок, Алматы 2009. session_start(); $capt=new myCaptcha(); $capt->new_captcha(); class myCaptcha { var $img_x = 160; # Ширина var $img_y = 50; # Высота var $num_n = 5; # Кол-во цифр var $font_min_size = 12; # Минимальный размер шрифта var $lines_n_max = 8; # Максимальное число шумовых линий var $nois_percent = 4; # Зашумленность цветами фона и текста, в процентах. var $angle_max = 30; # Максимальный угол отклонения от горизонтали по часовой стрелке и против. var $fonts_dir="ttf/"; # дирректория со шрифтами *.TTF можно заливать красивые (а главное понятные) шрифты var $back = array(255,255,240); # задний фон капчи var $colors=array( # цвет символов array(22,163,35), # зеленый array(214,36,7), # красный array(0,0,255), # синий ); var $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; # флаги эффектов, true - новый эффект, false - эффект спит. Поиграйте с различными комбинациями флагов. 9 вариантов. var $Nois=false; var $Line=false; var $Blur=false; var $mysession="captcha"; # на выходе - $captcha; var $number=''; # пустая переменная, в нее будет записыватся сгенерированная капча. function new_captcha() { if(is_dir($this->fonts_dir)) { # не забудьте проставить chmod() $dh=opendir($this->fonts_dir); while ($file = readdir($dh)) { if($file != "." && $file != "..") { # отсекаем текущий и родительский каталоги $fonts[]=$file; } } $this->font=$this->fonts_dir.$fonts[rand(0,count($fonts)-1)]; closedir($dh); } else { die("Шрифты на родину верните. :)"); } $this->handle=imagecreatetruecolor($this->img_x, $this->img_y); $this->nois_color = imagecolorallocate($this->handle, 88, 59, 110); $this->backHandle=imagecolorallocate($this->handle, $this->back[0], $this->back[1], $this->back[2] ); $color = $this->colors[mt_rand(0, sizeof($this->colors)-1)]; $this->FontColor = imagecolorallocate($this->handle, $color[0], $color[1], $color[2]); imagefilledrectangle($this->handle, 0, 0, $this->img_x, $this->img_y, $this->backHandle); #$number=''; for ($n=0; $n < $this->num_n; $n++){ $num = $this->chars[rand(0, strlen($this->chars)-1)]; $this->number .= $num; $font_size=rand($this->font_min_size, $this->img_y/2); $angle=rand(360-$this->angle_max,360+$this->angle_max); # вычисление координат для каждой цифры, что обеспечивают нормальное расположние # при любых значениях размеров цифры и изображения $y=rand(($this->img_y-$font_size)/4+$font_size, ($this->img_y-$font_size)/2+$font_size); $x=rand(($this->img_x/$this->num_n-$font_size)/2, $this->img_x/$this->num_n-$font_size)+$n*$this->img_x/$this->num_n; imagettftext($this->handle, $font_size, $angle, $x, $y, $this->FontColor, $this->font, $num); } # --- пошли эффекты --- # Шумовые пиксели if($this->Nois) { $nois_n_pix=round($this->img_x*$this->img_y*$this->nois_percent/100); for ($n=0; $n<$nois_n_pix; $n++){ $x=rand(0, $this->img_x); $y=rand(0, $this->img_y); imagesetpixel($this->handle, $x, $y, $this->nois_color); } for ($n=0; $n<$nois_n_pix; $n++){ $x=rand(0, $this->img_x); $y=rand(0, $this->img_y); imagesetpixel($this->handle, $x, $y, $this->backHandle); }; } # линии if($this->Line){ $lines_n=rand(0,$this->lines_n_max); for ($n=0; $n < $lines_n; $n++){ $x1=rand(0, $this->img_x); $y1=rand(0, $this->img_y); $x2=rand(0, $this->img_x); $y2=rand(0, $this->img_y); imageline($this->handle, $x1, $y1, $x2, $y2, $this->nois_color); } } # Гауссовская размазка if($this->Blur){ imagefilter($this->handle, IMG_FILTER_GAUSSIAN_BLUR); } Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); Header("Last-Modified: ".gmdate("D, d M Y H:i:s")."GMT"); Header("Cache-Control: no-cache, must-revalidate"); Header("Pragma: no-cache"); header("Content-type: image/png"); imagepng($this->handle); imagedestroy($this->handle); $_SESSION[$this->mysession]=$this->number; } } ?>
sylex Ну мне нужно, чтобы был реальный сайт, где она стоит. А вообще, давно мечтаю тестировать каптчу на распознавание. Все руки никак не дойдут...
Kreker в известной программе для регистрации сайта по каталогам AllSubmitter есть анализ каптчи... процентов 50 точно угадывает верно, но это тока потому, что в основном везде они простые... а сложные каптчи по-моему невозможно распознать... правда и самому их читать тяжело