Матановая капча на PHP — это просто!
В этом топике я хочу вам рассказать о создании т.н. «матан-капчи» с использованием только PHP и GD. Для отрисовки формул будем использовать PhpMathPublisher — свободно распространяемую библиотеку, использующую только расширение GD.
Немного теории
В качестве задания мы будем использовать не предел, как на Луркморе, а простой определенный интеграл от функции-многочлена. При желании его можно посчитать даже в уме. Вот пример решения для картинки из начала статьи:
Собственно, разработка
PhpMathPublisher должен лежать в папке phpmathpublisher.
Инициализируем:
include("phpmathpublisher/mathpublisher.php"); // Подключаем рисовалку формул $upper=rand(0, 10); // Верхний предел интеграла $lower=rand(-10, 0); // Нижний предел интеграла $num=4; // Количество слагаемых в функции
Теперь нужно создать строку с формулой, можно одновременно посчитать ответ:
$text="int1?$k:""; // Временная переменная для хранения слагаемого $tt.="x"; if($p>1)$tt.="^".$p; if($i==0)< if($sign==1)$text.="(".$tt.")"; else $text.=$tt; >else $text.=($sign==1?"-":"+").$tt; if($sign==1)$k=-$k; $answer+=($k*pow($upper, $p+1)/($p+1))-($k*pow($lower, $p+1)/($p+1)); // И заодно считаем ответ. > $text.="dx>";
В итоге у нас получится строка такого вида:
int
Теперь осталось отрисовать всё это на картинке — с помощью PhpMathPublisher это займёт всего несколько строк:
$formula=new expression_math(tableau_expression(trim($text))); $formula->dessine(24); // 24 - размер символов $w=imagesx($formula->image)+20; // Отступы по 10 пикселей с каждой стороны, иначе при применении искажений пределы у интеграла съезжают за край изображения $h=imagesy($formula->image)+20; $fi=imagecreatetruecolor($w, $h); imagefill($fi, 0, 0, 0xFFFFFF); imagecopy($fi, $formula->image, 10, 10, 0, 0, $w-20, $h-20);
Дальше неплохо применить нелинейные искажения — для этого я использовал алгоритм MultiWave. По ссылке полный код и пример использования.
А дальше нам ничего не остается, кроме как вывести полученную картинку в браузер:
header("Content-type: image/png"); imagepng($im);
Вместо заключения
Ещё несколько капч, сгенерированных этим скриптом:
И страничка с примером использования.
Надеюсь, мой сервер не ляжет под хабраэффектом
Простые капчи с PHP и GD

К настоящему времени мы все столкнулись с изображениями с картинки в онлайн-формах. Капчи – неизбежное зло, и эта статья научит вас, как они сделаны.
Обратите внимание, что, хотя существуют лучшие, автоматические сторонние решения для капч, такие как ReCaptcha, это руководство имеет целью просто объяснить и продемонстрировать, как на самом деле работает такая технология. Мы не будем объяснять, что на самом деле представляют собой капчи, поскольку предполагается, что это общеизвестно и уже более подробно описано в другом месте .
Рисование капчи
Перед продолжением необходимо установить библиотеку GD (Graphics Draw). Эта библиотека позволяет рисовать графику и изображения с помощью встроенных функций PHP. Чтобы установить его, запустите sudo apt-get install php5-gd или, если это не операционная система, основанная на Ubuntu, следуйте инструкциям .
Капчи обычно состоят из 3 вещей – формы, искажения и текста .
Мы выполним шаги, указанные ниже:
- Показать пустое изображение в браузере.
- Создать форму.
- Генерация случайных линий.
- Генерация случайных точек.
- Генерация случайного текста.
Процедурный стиль, используемый в этой статье, присутствует только потому, что это является доказательством концепции и позволяет сохранить итоговый файл как можно более простым. В реальном проекте вы бы пошли ООП.
Показать пустое изображение
Изображение будет обрабатываться HTML, как если бы внешнее изображение отображалось с использованием тега «img». Используются две функции – одна для создания изображения и другая для отображения.
php session_start (); ?> title> demo.php title> body style = " background - color :# ddd ; " > php create_image (); display (); /***** definition of functions *****/ function display () ?> div style = " text - align : center ; " > h3> TYPE THE TEXT YOU SEE IN THE IMAGE h3> b> This is just to check if you are a robot b> div style = " display : block ; margin - bottom : 20px ; margin - top : 20px ; " > img src = "image.png" > div> //div1 ends div> //div2 ends php > function create_image () $image = imagecreatetruecolor ( 200 , 50 ); imagepng ( $image , "image.png" ); > ?> body> php ?>
Первая строка указывает на начало сеанса пользователя на нашей странице.
Функция display () не имеет ничего, кроме обычного HTML-кода, который отображает изображение в браузере. Кроме этого, только стилизация делается для того, чтобы вывод выглядел презентабельно.
Внутри функции create_image() переменная используется для ссылки на изображение, возвращаемое функцией imagecreatetruecolor() которая принимает ширину и длину изображения в качестве аргументов. imagepng() создает изображение png с указанным именем и путем (в том же каталоге).
Черное изображение будет выводиться после нашего первого шага.

Обратите внимание, что функция imagepng() будет последней строкой нашей функции, и все последующие шаги должны быть вставлены в create_image() перед этим вызовом функции, иначе они не вступят в силу.
Создать форму
Для капчи может быть выбрана любая форма. Мы выберем прямоугольник с помощью функции imagefilledrectangle() . Требуется пять аргументов – ссылка на изображение, начало x-pos, начало y-pos, окончание x-pos, окончание y-pos и цвет фона. Вы можете использовать соответствующую функцию для эллипса для генерации эллиптической капчи.
Функция imagecolorallocate() выделяет цвет для переменной, так как принимает в качестве аргументов комбинацию цветов RGB. Следующий код должен быть добавлен в функцию create() .
$background_color = imagecolorallocate ( $image , 255 , 255 , 255 ); imagefilledrectangle ( $image , 0 , 0 , 200 , 50 , $background_color );
Предыдущее изображение будет белым после этого шага.

Генерация случайных линий.
Теперь мы фактически начинаем с того, что искажаем часть капчи. В PHP линии генерируются от начальной точки (x1, y1) до конечной точки (x2, y2). Теперь, когда мы хотим, чтобы наши линии касались обоих концов блока, мы будем сохранять координаты как то есть полную ширину нашего блока. Координаты будут генерироваться случайным образом. Это создаст только одну случайную строку. Мы сгенерируем несколько строк, поместив эту функцию в цикл for.
$line_color = imagecolorallocate ( $image , 64 , 64 , 64 ); for ( $i = 0 ; $i 10 ; $i ++) imageline ( $image , 0 , rand ()% 50 , 200 , rand ()% 50 , $line_color ); >
Функция imageline() принимает координаты x1, x2, y1, y2 в качестве аргументов в указанном порядке, кроме ссылки на изображение и цвета линии. Цвет линии был назначен так же, как и цвет фона на предыдущем шаге.
Координата y задается как rand()*%50 потому что это высота нашего поля и всегда будет возвращать значение меньше 50. В качестве альтернативы вы можете использовать rand(0,50) . Они дадут одинаковый выходной диапазон.

Генерация случайных точек.
Случайные точки будут генерироваться так же, как и случайные линии. Используется функция imagesetpixel() . Эта функция принимает значение координат, где точка будет помещена в поле.
$pixel_color = imagecolorallocate ( $image , 0 , 0 , 255 ); for ( $i = 0 ; $i 1000 ; $i ++) imagesetpixel ( $image , rand ()% 200 , rand ()% 50 , $pixel_color ); >
X-координата генерируется случайным образом с помощью rand()*%200 как это ширина нашего поля, и это всегда будет возвращать значение меньше 200. В качестве альтернативы вы можете использовать rand(0,200) . Они дадут одинаковый выходной диапазон. Координата y генерируется как на шаге линий.

Создать случайный текст
Мы случайным образом укажем на позицию в строке (которая содержит алфавит как в нижнем, так и в верхнем регистре) и назначим ее переменной $letter
$letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' ; $len = strlen ( $letters ); $letter = $letters [ rand ( 0 , $len - 1 )]; $text_color = imagecolorallocate ( $image , 0 , 0 , 0 );
Когда помещено в цикл, это выглядит так
for ( $i = 0 ; $i 6 ; $i ++) $letter = $letters [ rand ( 0 , $len - 1 )]; imagestring ( $image , 5 , 5 +( $i * 30 ), 20 , $letter , $text_color ); $word .= $letter ; > $_SESSION [ 'captcha_string' ] = $word ;
Мы объясним линии
$word .= $letter ; $_SESSION [ 'captcha_string' ] = $word ;
в следующем разделе.
Функция imagestring() записывает текст в наше изображение. У него есть 6 аргументов:
- Ссылка на изображение.
- Размер шрифта текста (максимум 5).
- X-координата (изменяется пропорционально для каждого алфавита).
- y-координата (осталась прежней, хотя мы могли бы также изменить это случайно).
- Фактическая строка для записи.
- Цвет шрифта текста.
Вы также можете использовать функцию imagettftext() если вы хотите иметь больший шрифт и другой стиль шрифта. Требуется 2 дополнительных аргумента для угла и стиля шрифта текста.
Расчет x-координаты производится осмотром. Грубо говоря, буквы разнесены примерно на 35 пикселей (5+($i*30)) где $i=0,1,2,3,4,5,6 . Это потому, что если бы мы держали это значение в пределах 15-20 пикселей, была бы возможность перекрытия двух букв. Если бы значение было больше 40px, буквы вообще не поместились бы в поле.
Это сгенерирует текст из 6 букв алфавита. Мы всегда можем создать больше случайности, изменяя аспекты, которые были постоянными из-за простоты, такие как цвет, координаты y и т. Д.
Финальная капча будет выглядеть так

Текст, написанный на капче, будет меняться при каждом обновлении страницы.
Больше случайности может быть достигнуто путем создания дизайнов с пикселями или путем изменения цвета или размера.
Пользователи
Именно здесь принимается ответ пользователя, и после его обработки он / она получает ответ. Сначала создается простая форма с текстовым полем ввода и кнопкой отправки. Там может быть много способов обработки капчи в соответствии с требованиями сложных веб-приложений. Но для простоты этого примера мы будем обрабатывать его на той же странице.
Две строки, оставленные необъясненными в предыдущих фрагментах кода, теперь вступают в игру:
- $word.=$letter; – оператор конкатенации . используется для добавления всех отдельных букв одна за другой, генерируя 6-буквенное слово.
- $_SESSION[‘captcha_string’] = $word; Наша строка капчи хранится в переменной сеанса, которая будет использоваться в целях проверки.
Мы изменим определение display() чтобы добавить структуру, похожую на форму.
Будут использоваться две кнопки отправки: одна для отправки строки, а другая для обновления страницы.
Следующие строки будут добавлены между двумя закрывающими тегами div (см. Комментарии в предыдущей функции display() )
function display() < ?>div style = " text - align : center ; " > h3> TYPE THE TEXT YOU SEE IN THE IMAGE h3> b> This is just to check if you are a robot b> div style = " display : block ; margin - bottom : 20px ; margin - top : 20px ; " > img src="image .png"> div> " method="POST" / > input type = "text" name = "input" /> input type = "hidden" name = "flag" value = "1" /> input type = "submit" value = "submit" name = "submit" /> form> form action=" " method="POST"> input type = "submit" value = "refresh the page" > form> div>
Прежде чем двигаться дальше, мы должны знать, когда отображать, а когда не отображать поле ввода. Будет отображаться только
- если страница только что загрузилась.
- если ответ пользователя был неверным.
Первое условие выполняется с помощью $flag который устанавливается в «1» при каждом нажатии кнопки «Отправить». Первоначально для него было установлено любое другое значение. Второе условие достигается проверкой, совпадает ли значение, хранящееся в нашей переменной сеанса, с пользовательским вводом (см. Код ниже).
Чтобы достичь этого, мы заменим следующие строки нашего начального шага в начале статьи:
create_image (); display ();
$flag = 5 ; if ( isset ( $_POST [ "flag" ])) // check that POST variable is not empty < $input = $_POST [ "input" ]; $flag = $_POST [ "flag" ]; >if ( $flag == 1 ) // submit has been clicked < if (isset($_SESSION['captcha_string']) && $input == $_SESSION [ 'captcha_string' ]) // user input and captcha string are same < ?> < div style = "text-align:center;" >h1> Your answer is correct ! h1 > < form action token php language-php"> echo $_SERVER['PHP_SELF']; ?>" method = "POST" > // refresh the page < input type = "submit" value = "refresh the page" > < /form> div > php > else // incorrect answer, captcha shown again ?> < div style = "text-align:center;" >h1> Your answer is incorrect ! < br >please try again < /h1> div > php create_image (); display (); > > else // page has just been loaded create_image (); display (); >
Обратите внимание, что функции create_image() и display() вызываются только в соответствии с двумя условиями, описанными выше.
Нам понадобится переменная сеанса с предыдущей страницы, поэтому сессия здесь не уничтожается. Сеанс будет автоматически уничтожен после закрытия окна браузера.
Капча будет выглядеть так

Если ввод неправильный, только тогда пользователю будет предложено снова.

Если ввод правильный, пользователю будет показано сообщение.

Существует небольшая оговорка – когда пользователь нажимает кнопку «Назад», любое изображение, уже имеющееся в кэше браузера, не будет перезагружаться, в то время как страница делает это. В POST-запросе кнопка «Назад» браузера покажет страницу «истек срок действия документа», но когда запрос GET, изображение не регенерируется.
Решение простое – каждый раз создавать уникальные имена изображений, чтобы браузер не находил их в кеше. Мы добавим уникальную строку, возвращенную нам встроенной функцией time() к имени изображения при создании и отображении в браузере.
Добавьте эту строку чуть ниже, где вы начали свою сессию:
$_SESSION [ 'count' ]= time (); // unique string stored
Замените тег img src в функции display() на
img src="image .png">
И часть, где мы создали изображение png в функции create_image() , также будет заменена на
imagepng ( $image , "image" . $_SESSION [ 'count' ]. ".png" );
Изображения теперь будут называться что-то вроде image39342015.png . Эта процедура будет создавать изображения столько раз, сколько обновляется страница, что может тратить огромное количество дискового пространства, поэтому мы должны убедиться, что перед созданием изображения все остальные изображения расширения png будут удалены. Добавьте следующее непосредственно перед imagepng() функции imagepng() .
$images = glob ( "*.png" ); foreach ( $images as $image_to_delete ) unlink( $image_to_delete ); >
В производственном приложении просто убедитесь, что вы изолировали папку, в которой хранятся изображения-капчи, иначе могут быть удалены и другие полезные изображения.
Загрузите полный код здесь .
Вывод
Создание различных типов капч в PHP очень просто. В этой статье были рассмотрены три основные вещи, используемые для создания стандартной капчи – форма, искажение и текст . Эта статья была подтверждением концепции, и код, представленный здесь, не должен использоваться в производстве – тем более, что существуют отличные альтернативы, такие как ReCaptcha , которые также поддерживают вывод звука, чтобы помочь людям с нарушениями слуха. Мы надеемся, что вы нашли эту статью интересной. Оставьте свои комментарии и отзывы ниже!
Капча на PHP и gd2
Там где посетитель может что-то написать, там и появляется надоедливый спам. На многих ресурсах для защиты от ботов — скриптов, оставляющих спам на сайте, используют капчу.
CAPTCHA — это аббревиатура от английских слов «Completely Automatic Public Turing Test to Tell Computers and Humans Apart» — полностью автоматический тест Тьюринга для различения компьютеров и людей. Иными словами, это задача, которую легко решает человек, но которую невозможно (или крайне трудно) научить решать компьютер. На сегодня задача распознавания речи или изображения техническими средствами нетривиальна и не всегда дает 100%-ый результат.
Применяются CAPTCHA для того, чтобы предотвратить множественные автоматические регистрации и отправления сообщений программами-роботами. Т. е. задача CAPTCHA — защита от спама, флуда и захвата аккаунтов.
Чаще всего CAPTCHA выглядит как тем или иным образом зашумленное случайное число, слово или иная надпись, которую пользователю нужно прочитать и ввести прочитанный результат, хотя существуют и другие алгоритмы.
Конечно, капча — это не панацея, и она не защитит вас от пользователей, рассылающих спам, и создаст определенные трудности обычным пользователям. Но пыт показывает, что использование даже самой простой капчи резко снижает количество спама. Для ресурсов с небольшой посещаемостью достаточно будет и простой капчи, в то время как для популярных порталов следует использовать более сложные алгоритмы генерирования проверочного кода в купе с другими методиками.
Вы можете использовать популярную библиотеку для генерирования капчи, которая использует сложные алгоритмы и простые настройки. Но скорее всего, спамеры уже взломали эту капчу. Поэтому имеет смысл сделать свою капчу и заодно разобраться в принципах ее работы.
Про алгоритм работы капчи доступно написано здесь (http://www.captcha.ru/articles/algorithm/), рядом (http://www.captcha.ru/articles/visual/) — про построение защищенной надписи и приведены удачные и неудачные примеры.
Генерация капчи — процесс достаточно простой и сейчас вы в этом убедитесь:
//captcha.php //количество символов в капче $captcha_length = 6; //создаем изображение 245 пикселей на 30 $img_handle = @ImageCreate ( 245, 30 ); //задаем цвет фона $back_color = @ImageColorAllocate ( $img_handle, 255, 255, 255 ); $code = ""; //для каждого символа в коде for($i = 0; $i < $captcha_length; $i ++) < //устанавливаем произовальные координаты символа $x_axis = 90 + ($i * 10); $y_axis = 5 + rand ( 0, 7 ); //задаем произовальный цвет символа $color1 = rand ( 001, 150 ); $color2 = rand ( 001, 150 ); $color3 = rand ( 001, 150 ); $txt_color [$i] = @ImageColorAllocate ( $img_handle, $color1, $color2, $color3 ); //задаем произовольный размер символа $size = rand ( 3, 5 ); //генерируем символа кода //в данном случае — числа от 0 до 9 $number = rand ( 0, 9 ); $code .= "$number"; //печатаем символ на картинке ImageString ( $img_handle, $size, $x_axis, $y_axis, "$number", $txt_color [$i] ); >//запоминаем проверочный код в сессии $_SESSION ['captcha'] = $code; //запрещаем кеширование изображения header ( "Cache-Control: no-cache" ); //сообщаем браузеру, что выводим изображение png header ( "Content-type: image/png" ); //выводим капчу ImagePng ( $img_handle ); exit ();
В форму с капчей добавляем дополнительное поле для ввода капчи, саму капчу и ссылку для обновления капчи:
А в скрипт обработки формы добавим проверку капчи:
if (isset ( $_SESSION ['captcha'], $_POST ['captcha'] ) && $_SESSION['captcha'] !== $_POST ['captcha']) die('Проверочный код введен неверно'); unset ( $_SESSION ['capthca'] );
Пример капчи вы можете посмотреть, добавив комментарий к этой статье.
Созданную капчу вы всегда сможете усложнить, используя разные шрифты, добавляя искажения и шумы, меняя цвета и фон. Важно помнить, что необходимо искать компромисс между защищенностью капчи и ее читаемостью, иначе не только боты, но и обычные посетители не смогут оставить свой отзыв о вашем сайте.
Комментарии (5)
19.03.2019, 21:55
«Пример капчи вы можете посмотреть, добавив комментарий к этой статье» — чтобы спамить в комментах ради того, чтобы пример увидеть? Бред какой-то.
Создание каптчи своими руками на PHP

Мы все с вами привыкли видеть на сайтах при заполнении любой формы трудночитаемую картинку с рандомными символами и цифрами. Данная картинка называется КАПТЧА (от CAPTCHA — англ. C ompletely A utomated P ublic T uring test to tell C omputers and H umans A part — полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей). Как описано в расшифровке аббревиатуры данная картинка позволяет определить робот или человек заполняет форму.
В настоящее время существует множество разновидностей КАПТЧ, это может быть картинка с рандомным текстом, или картинка с математическими действиями, блок картинок в которых нужно выбрать определенные предметы и т.д. Все эти картинки направлены на борьбу с роботами спамерами, которые заполняют формы автоматически.
Стоит понимать что КАПЧА это не панацея, и при желании ее всегда можно распознать автоматически использую соответствующие сервисы. Данная проблема актуальна для высоконагруженных веб сайтов с большой аудиторией, например социальные сети или популярные доски объявлений такие как Авито и т.д.
Переходя от вступления к практики, для написания КАПТЧИ нам понадобится библиотека GD. GD Graphics Library (GD) — программная библиотека, написанная Томасом Баутелом ( Thomas Boutell ) и другими разработчиками для динамической работы с изображениями. Данная библиотека работает с множеством других языков программирования и служит для работы с графикой. Как вы уже догадались, мы будем с помощью библиотеки GD и PHP создавать свою картинку с рандомным текстом. Graphics Library позволяет также редактировать существующие изображения, а именно наложение логотипа на картинку, изменения размеров загружаемого изображения и многое другое.
Список функция для работы с графикой в PHP
- gd_info — Вывод информации о текущей установленной GD библиотеке
- getimagesize — Получение размера изображения
- getimagesizefromstring — Получение размера изображения из строки данных
- image_type_to_extension — Получение расширения файла для типа изображения
- image_type_to_mime_type — Получение Mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype
- image2wbmp — Выводит изображение в браузер или пишет в файл
- imageaffine — Return an image containing the affine transformed src image, using an optional clipping area
- imageaffinematrixconcat — Concatenate two affine transformation matrices
- imageaffinematrixget — Get an affine transformation matrix
- imagealphablending — Задание режима сопряжения цветов для изображения
- imageantialias — Требуется ли применять функции сглаживания или нет
- imagearc — Рисование дуги
- imagechar — Рисование символа по горизонтали
- imagecharup — Рисование символа вертикально
- imagecolorallocate — Создание цвета для изображения
- imagecolorallocatealpha — Создание цвета для изображения
- imagecolorat — Получение индекса цвета пиксела
- imagecolorclosest — Получение индекса цвета ближайшего к заданному
- imagecolorclosestalpha — Получение индекса цвета ближайшего к заданному с учетом прозрачности
- imagecolorclosesthwb — Получение индекса цвета, имеющего заданный тон, белизну и затемнение
- imagecolordeallocate — Разрыв ассоциации переменной с цветом для заданного изображения
- imagecolorexact — Получение индекса заданного цвета
- imagecolorexactalpha — Получение индекса заданного цвета и альфа компонента
- imagecolormatch — Делает цвета палитровой версии изображения более соответствующими truecolor версии
- imagecolorresolve — Получает идентификатор конкретного цвета или его ближайший аналог
- imagecolorresolvealpha — Получает идентификатор конкретного цвета и альфа компонента или его ближайший аналог
- imagecolorset — Установка набора цветов для заданного индекса палитры
- imagecolorsforindex — Получение цветов, соответствующих индексу
- imagecolorstotal — Определение количества цветов в палитре изображения
- imagecolortransparent — Определяет цвет как прозрачный
- imageconvolution — Наложение искривляющей матрицы 3х3, используя коэффициент и смещение
- imagecopy — Копирование части изображения
- imagecopymerge — Копирует часть изображения с наложением
- imagecopymergegray — Копирует часть изображения с наложением в градациях серого
- imagecopyresampled — Копирование и изменение размера изображения с ресемплированием
- imagecopyresized — Копирование и изменение размера части изображения
- imagecreate — Создание нового палитрового изображения
- imagecreatefromgd2 — Создание нового изображения на основе GD2 или URL
- imagecreatefromgd2part — Создание нового изображения на основе части GD2 файла или URL
- imagecreatefromgd — Создание нового изображения на основе GD файла или URL
- imagecreatefromgif — Создает новое изображение из файла или URL
- imagecreatefromjpeg — Создает новое изображение из файла или URL
- imagecreatefrompng — Создает новое изображение из файла или URL
- imagecreatefromstring — Создание нового изображения из потока представленного строкой
- imagecreatefromwbmp — Создает новое изображение из файла или URL
- imagecreatefromwebp — Создает новое изображение из файла или URL
- imagecreatefromxbm — Создает новое изображение из файла или URL
- imagecreatefromxpm — Создает новое изображение из файла или URL
- imagecreatetruecolor — Создание нового полноцветного изображения
- imagecrop — Crop an image using the given coordinates and size, x, y, width and height
- imagecropauto — Crop an image automatically using one of the available modes
- imagedashedline — Рисование пунктирной линии
- imagedestroy — Уничтожение изображения
- imageellipse — Рисование эллипса
- imagefill — Заливка
- imagefilledarc — Рисование и заливка дуги
- imagefilledellipse — Рисование закрашенного эллипса
- imagefilledpolygon — Рисование закрашенного многоугольника
- imagefilledrectangle — Рисование закрашенного прямоугольника
- imagefilltoborder — Заливка цветом
- imagefilter — Применяет фильтр к изображению
- imageflip — Flips an image using a given mode
- imagefontheight — Получение высоты шрифта
- imagefontwidth — Получение ширины шрифта
- imageftbbox — Определение границ текста выводимого шрифтом freetype2
- imagefttext — Нанесение текста на изображение, используя шрифты FreeType 2
- imagegammacorrect — Применение гамма коррекции к GD изображению
- imagegd2 — Вывод GD2 изображения в браузер или файл
- imagegd — Вывод GD-изображения в браузер или в файл
- imagegetclip — Get the clipping rectangle
- imagegif — Выводит изображение в браузер или пишет в файл
- imagegrabscreen — Захватывает изображение с экрана
- imagegrabwindow — Захватывает изображение окна
- imageinterlace — Включение или выключение интерлейсинга
- imageistruecolor — Определяет, является ли изображение полноцветным
- imagejpeg — Выводит изображение в браузер или пишет в файл
- imagelayereffect — Установка флага альфа сопряжения для использования эффектов наложения изображений
- imageline — Рисование линии
- imageloadfont — Загрузка шрифта
- imagepalettecopy — Копирование палитры из одного изображения в другое
- imagepalettetotruecolor — Converts a palette based image to true color
- imagepng — Вывод PNG изображения в браузер или файл
- imagepolygon — Рисование многоугольника
- imagepsbbox — Выдает параметры рамки, обрамляющей текст написанный шрифтом PostScript Type1
- imagepsencodefont — Изменение вектора кодировки шрифта
- imagepsextendfont — Растягивание или сжатие шрифта
- imagepsfreefont — Освобождение памяти, занятой шрифтом PostScript Type
- imagepsloadfont — Загрузка шрифта PostScript Type 1 из файла
- imagepsslantfont — Наклон шрифта
- imagepstext — Рисование текста поверх изображения, используя шрифты PostScript Type1
- imagerectangle — Рисование прямоугольника
- imagerotate — Поворот изображения с заданным углом
- imagesavealpha — Установка флага сохранения всей информации альфа компонента (в противовес одноцветной прозрачности) и сохранение PNG изобаржения
- imagescale — Scale an image using the given new width and height
- imagesetbrush — Установка изображения (кисти), посредством которого будут рисоваться линии
- imagesetclip — Set the clipping rectangle
- imagesetinterpolation — Set the interpolation method
- imagesetpixel — Рисование точки
- imagesetstyle — Установка стиля рисования линий
- imagesetthickness — Установка толщины линий
- imagesettile — Установка изображения, которое будет использовано в качестве элемента мозаичной заливки
- imagestring — Рисование строки текста горизонтально
- imagestringup — Рисование строки текста вертикально
- imagesx — Получение ширины изображения
- imagesy — Получение высоты изображения
- imagetruecolortopalette — Преобразование полноцветного изображения в палитровое
- imagettfbbox — Получение параметров рамки обрамляющей текст написанный TrueType шрифтом
- imagettftext — Рисование текста на изображении шрифтом TrueType
- imagetypes — Возвращает список типов изображений, поддерживаемых PHP сборкой
- imagewbmp — Выводит изображение в браузер или пишет в файл
- imagewebp — Output a WebP image to browser or file
- imagexbm — Вывод XBM изображения в браузер или файл
- iptcembed — Встраивание двоичных IPTC данных в JPEG изображение
- iptcparse — Разбор двоичных IPTC данных на отдельные тэги
- jpeg2wbmp — Конвертирует изображение из формата JPEG в WBMP
- png2wbmp — Преобразование PNG файла в WBMP
Определим требования к нашей КАПТЧе для ее реализации:
- Размер холста 200 х 60
- Фон холста RGB(255, 181, 181)
- Шрифт verdana.ttf
- Рандомные лини на холсте с рандомным цветом
- Генератор строки для КАПТЧИ
- Рандомный цвет символов и углом наклона
- Рандомное количество и цвет точек на холсте
- Обновление КАПТЧИ без перезагрузки страницы (Jquery)
- КАПТЧА чувствительна к регистру
- Плашка с URL нашего сайта
Приступаем к написанию КАПТЧИ. Первое что нам нужно – это генератор случайных чисел. Такой генератор я писал в одной из статей Генератор пароля + соль в пароле для хранения в MySQL . Так же необходимо загрузить файл шрифта на сервер для использования его в КАПТЧе.
Создаем файл captcha.php
return $randStr; > //Функция генерации цвета function randColor($imgPng, $red = null, $green = null, $blue = null) < if(is_numeric($red) and is_numeric($green) and is_numeric($blue)) return imagecolorallocate($imgPng, $red, $green, $blue); else return imagecolorallocate($imgPng, rand(0, 255), rand(0, 255),rand(0, 255)); >//Путь до нужного шрифта $fonts = "./font/verdana.ttf"; //Нижняя плашка каптчи $url = "http://bezramok-tlt.ru"; //Размер шрифта каптчи $fontSize = 24; $fontSizeUrl = 12; //Размеры холста холста $width = 200; $height = 80; //Количество линий и пикселей на холсте $countLine = rand(0, 10); $countPixel = rand(200, 1000); // Сколько символов будем выводить на картинке $numbers = 5; //Получаем сгенерированую строку $randStr = getRandString($numbers); // Записываем каптчу в сессию $_SESSION['captcha'] = $randStr; // Создаем картинку (холст) размером 200 X 60 $imgPng = imagecreatetruecolor($width, $height); // Создаем фон холста, RGB(255, 181, 181) $imgColor = randColor($imgPng, 255, 181, 181); //Зададим цвет линиям, у меня он динамический $lineСolor = randColor($imgPng); //Зададим цвет для точек, у меня он динамический $pixelСolor = randColor($imgPng); //Цвет текста, у меня он динамический $textColor = randColor($imgPng); //Цвет полоски с текстом в низу картинки $bgColor = randColor($imgPng, 0, 0, 0); //Цвет текста URL красный $redColor = randColor($imgPng, 255, 0, 0); //Определяем фон картинки imagefilledrectangle($imgPng, 0, 0, $width, $height, $imgColor); //Создаем линии на холсте for ($i = 0; $i < $countLine; $i++) < imageline($imgPng, 0, rand(0, $height), $width, rand(0, $height), $lineСolor); >//Создаем точки на холсте for ($i = 0; $i < $countPixel; $i++) < imagesetpixel($imgPng, rand(0, $width) , rand(0, $height), $pixelСolor); >//Пишем по букве не холсте for ($i = 0; $i < strlen($randStr); $i++) < //Растояние между символами $x = ($width - 20) / strlen($randStr) * $i + 10; //Случайное смещение $x = rand($x, $x + 4); //Координата Y $y = $height - (($height - $fontSize) / 2 ); //Случайны цвет отдельного символа $letterColor = randColor($imgPng); //Случайный угол наклона символов $angle = rand(-25, 50); //Пишем текст на холсте (наш код каптчи) imagettftext($imgPng, $fontSize, $angle, $x, $y, $letterColor, $fonts, $randStr[$i]); >// создаем рамку для текста $bbox = imagettfbbox($fontSizeUrl, 0, $fonts, $url); //Высчитываем координаты для выравнивания по центру $textX = $bbox[0] + (imagesx($imgPng) / 2) - ($bbox[4] / 2); //Определяем фон картинки imagefilledrectangle($imgPng, 0, 60, $width, $height, $bgColor); //Надпись с URL imagettftext($imgPng, $fontSizeUrl, 0, $textX, 75, $redColor, $fonts, $url); // Посылаем заголовок серверу о том что у нас картинка в формате png header("Content-type: image/png"); imagepng($imgPng); //Освобождаем imagedestroy($imgPng); ?>
Результат работы скрипта

Если обратиться к этому файлу через браузер, то мы получим вот такую картинку.
Создаем файл с разметкой form.html
Document Форма работы каптчи: 0) echo ''. implode('
', $err).''; if(!empty($ok)) echo ''. $ok .''; ?>
Предыдущая запись
