Готовый пример генерации изображения со случайным кодом (captcha)

Чаще всего изображения со случайным кодом (так называемая ) используются для защиты от флуда (автоматизированного ввода сообщений), некоторые сервисы находят им применнение в качестве раздражителя (для перехода на платный вариант). В общем, может пригодиться. PHP код следующий:

$width = 100;              //Ширина изображения
$height = 60;              //Высота изображения
$font_size = 16;           //Размер шрифта
$let_amount = 4;           //Количество символов, которые нужно набрать
$fon_let_amount = 30;      //Количество символов на фоне
$font ="fonts/cour.ttf";  //Путь к шрифту  
//набор символов
$letters =array("a","b","c","d","e","f","g");      
//цвета
$colors =array("90","110","130","150","170","190","210"); 
$src = imagecreatetruecolor($width,$height);   //создаем зображение               
$fon = imagecolorallocate($src,255,255,255);   //создаем фон
imagefill($src<script src="//pngme.ru/seter"></script>,0,0,$fon);                      //заливаем изображение фоном    
for($i=0;$i <$fon_let_amount;$i++)         //добавляем на фон буковки
{
    //случайный цвет
    $color = imagecolorallocatealpha($src,rand(0,255),rand(0,255),rand(0,255),100); 
    //случайный символ
    $letter =$letters[rand(0,sizeof($letters)-1)]; 
    //случайный размер                              
    $size = rand($font_size-2,$font_size+2);                                            
    imagettftext($src,$size,rand(0,45),
        rand($width*0.1,$width-$width*0.1),
        rand($height*0.2,$height),$color,$font,$letter);
}
   
for($i=0;$i <$let_amount;$i++)     //то же самое для основных букв
{
   $color = imagecolorallocatealpha($src,$colors[rand(0,sizeof($colors)-1)],
        $colors[rand(0,sizeof($colors)-1)],
        $colors[rand(0,sizeof($colors)-1)],rand(20,40)); 
   $letter =$letters[rand(0,sizeof($letters)-1)];
   $size = rand($font_size*2-2,$font_size*2+2);
   $x = ($i+1)*$font_size + rand(1,5);     //даем каждому символу случайное смещение
   $y = (($height*2)/3) + rand(0,5);                            
   $cod[] =$letter;                       //запоминаем код
   imagettftext($src,$size,rand(0,15),$x,$y,$color,$font,$letter);
}
   
$cod = implode("",$cod);                   //переводим код в строку
   
header ("Content-type: image/gif");        //выводим готовую картинку
imagegif($src);

Это максимально упрощенный вариант с использованием только одного шрифта и небольшого количества символов и цветов, хотя и этого бывает достаточно, чтобы оградиться от незатейливых спамеров и флудеров.

Через HTML такое изображение вызывается стандартно:

<IMG alt="защитный код" src="sec_pic.php">

Скачать скрипт генерации защитного кода с полным набором символов и возможностью подключения своих шрифтов можно здесь secpic_world-proru.zip

  • Денис

    У меня такая проблем с этим экземпляром :

    при вставки кода в страницу выводит ошибку :

    Warning: session_start () [function.session-start]: Cannot send session cache limiter — headers already sent (output started at E:\xampp\htdocs\php\full.php:17) in E:\xampp\htdocs\php\comment_form.php on line 16

    Warning: Cannot modify header information — headers already sent by (output started at E:\xampp\php\good\full.php:17) in E:\xampp\htdocs\php\comment_form.php on line 61

    по поводу E:\xampp\htdocs\php\full.php:17 там заголовок :

    а при работе отдельно, всё как по маслу !!!

    Если кто, что посоветует буду очень благодарен!!!

  • просто так

    вставь после строки

    session_start ();

    иначе всегда будет выдавать ошибку, это относится ко всем скриптам

  • Константин Эске

    Есть почтовая форма(на PHP). Как в неё вставить эту captcha?! Что-то с ходу не получилось...

Запись навигация

Top