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

Ну дак а как собственно сделать такое чудо ? Вот этим мы сегодня и займёмся.Причём “капчу” делать будем не простую, а “мусорную”(текст будет захламлён точками чёрного цвета).

Создадим два файла с именами captcha.php и form.php.

Далее попробую комментировать всё в коде, делая лишь небольшие отступления:

Captcha.php

  1. <?php session_start(); //Стартуем сессию, чтобы сохранить текст с картинки для проверки
  2. header("Content-type: image/png"); //Сообщаем что выводим картинку
  3. //Создаем пустое изображение размерами 88 на 31 пиксель
  4. $im = @imagecreate(88,31)
  5.    or die("Cannot Initialize new GD image stream");
  6.    
  7. //Задаём цвет фона в формате RGB
  8. $background_color = imagecolorallocate($im, 255, 255, 255);
  9. //Чёрный цвет
  10. $black=imagecolorallocate($im,0,0,0);
  11. //Белый цвет
  12. $white=imagecolorallocate($im,255,255,255);
  13. //Строка, отвечающая за символы, которые будут присутствовать в тексте на картинке
  14. $str="234C8J95L247N28G34";
  15. //Определяем длину строки и точку старта для надписи(верхний левый угол)
  16. $len=strlen($str);
  17. $x=10;
  18. $y=20;
  19. //Текст с картинки пока пуст
  20. $img="";
  21. /*
  22. Цикл, берёт случайный символ из строки и разукрашивает его случайным цветом из диапазона.
  23. font.ttf должен лежать в одном каталоге с этим фалом или пропишите относительный путь к нему.
  24. */
  25. for ($i=0;$i<5;$i++){
  26.     //наклон символов
  27.     $naklon = mt_rand(-7,7);
  28.     //Смещение вверх-вниз
  29.     $stypen = mt_rand(-7,7);
  30.    
  31.     $c=substr($str,rand(1,$len),1);
  32.     $img.=$c;
  33.     $color = imagecolorallocate($im, mt_rand(0,50), mt_rand(0,50),mt_rand(100,255));
  34.         imagettftext($im, 11 ,$naklon, $x, ($y+$stypen), $color,'font.ttf', $c);
  35.     $x+=15;
  36. }
  37. $p=0;
  38. //Выводим "мусор": простое чередование черных и белых пикселей и вывод на случайную позицию
  39. //$p - кол-во точек, я остановился на 300, можете поставить больше или меньше, но больше 500 лучше не ставить, ибо плохо читаться будет
  40. while($p<300)
  41.   {
  42.     $x=mt_rand(1,87);
  43.     $y=mt_rand(1,30);
  44.     $pixel=imagecolorat($im,$x,$y);
  45.     $point=($pixel==$black)?$white : $black;
  46.         imagesetpixel($im,$x,$y,$point);
  47.     $p++;
  48.   }
  49.     //Выводим картинку
  50.     imagepng($im);
  51.     //Чистим память за собой
  52.     imagedestroy($im);
  53.     //Забиваем текст в переменную сессии
  54.         $_SESSION["hide_img"]=$img;
  55. ?>

Шрифт, используемый в капче можно качнуть тут

form.php

  1. <?php session_start(); //обязательно должно быть в начале файла, до вывода чего-либо !
  2.  
  3. //Небольшая функция, оберегающая от "хороших" людей
  4. function nohtml($string){
  5.     $string=htmlspecialchars(stripslashes($string));
  6.     $string = mysql_escape_string($string);
  7.     return trim($string);
  8. }
  9. //Обязательные теги типа <html>,<body> опущу, только форма
  10.  
  11. //Проверяем были ли посланы данные
  12. if (empty($_POST['send'])){
  13.     echo '<form method="post">';
  14.     echo 'Имя: <input type="text" name="user" size="30"><br><br>';
  15.     echo 'Введите текст с картинки в поле ниже:<br><img src="captcha.php" width="88" heaght="31" alt="Включите картинки!"><br>';
  16.     echo '<input type="text" name="img">';
  17.     echo '<input type="submit" name="send" value="Проверить">';
  18.     echo '</form>';
  19. }else{
  20.     //Данные пришли, поехали
  21.     //Проверяем отправилось ли имя
  22.     if (!empty($_POST['user'])){
  23.         //Текст с картинки
  24.         if ($_POST['img']==$_SESSION['hide_img']){
  25.             echo nohtml($_POST['user']).", зрение вас не подвело ;)";
  26.         }
  27.     }else echo "Я вас не знаю!";
  28. }
  29. ?>

Ну вот собственно и всё, удачной защиты ;)