{% else-1 %}
Обновить | Подписаться | Поднять тему
Чтобы выполнить действие авторизируйтесь или пройдите регистрацию на сайте.
1. [автор] (30 янв 2013, 03:32) [0/0] [0] [отв] [спам] [под] +1 | -1

Что можно зделать что бы каптча отображалась?

2.
KoSh * 0.96
(30 янв 2013, 05:04) [0/0] [0] [отв] [спам] [под] +1 | -1

Ruzon, Для начала необходимо определиться со шрифтом. Соответствующий выбранному шрифту ttf-файл необходимо положить в директорию с будущим скриптом капчи. Я для капчи выбрал шрифт Comic Sans MS, ему соответствует файл comic.ttf. Файлы шрифтов можно найти в системном каталоге шрифтов вашей операционной системы, либо загрузить из Интернета.

3.
KoSh * 0.96
(30 янв 2013, 05:04) [0/0] [0] [отв] [спам] [под] +1 | -1

Ruzon, Далее создается скрипт captcha.php. В начале скрипта объявляются необходимые переменные:

$letters = \'ABCDEFGKIJKLMNOPQRSTUVWXYZ\';
В виде строки перечисляется алфавит. Это символы, которые будут участвовать в формировании капчи. Я перечислил заглавные латинские буквы, можно добавить, например, цифры.

$caplen = 6;
В этой переменной задается длина капчи (6 символов).

$width = 120; $height = 20;
Ширина и высота генерируемого изображения. Нужно, во-первых, подобрать размер в соответствии с дизайном вашего сайта, во-вторых, задать оптимальную ширину для указанной длины капчи, чтобы буквы не были слишком плотно прижаты друг к другу.

$font = \'comic.ttf\';
Здесь указывается файл шрифта. В принципе, его можно разместить в поддиректории, допустим, fonts, тогда содержимое переменной должно быть такого формата: fonts/comic.ttf.

$fontsize = 14;

4.
KoSh * 0.96
(30 янв 2013, 05:05) [0/0] [0] [отв] [спам] [под] +1 | -1

Размер шрифта.

С переменными разобрались. Далее, приступаем непосредственно к реализации. Во-первых, необходимо указать клиенту запрошенного скрипта, что ответный контент представляет из себя не текст, а изображение. Для этого переопределяем содержимое HTTP-заголовка content-type:

header(\'Content-type: image/png\');
Создаем изображение с заданными размерами:

$im = imagecreatetruecolor($width, $height);
Выставляем флаг необходимости сохранения альфа-канала изображения:

imagesavealpha($im, true);
Создаем цвет фона. Это будет полностью прозрачный цвет:

$bg = imagecolorallocatealpha($im, 0, 0, 0, 127);
Заливаем этим цветом наше созданное изображение:

imagefill($im, 0, 0, $bg);

5.
KoSh * 0.96
(30 янв 2013, 05:05) [0/0] [0] [отв] [спам] [под] +1 | -1

Этими действиями мы подготовили наше изображение для наложения на него капчи. Следующая строка необходима не всегда, зависит от настроек веб-сервера. Она переопределяет путь к поиску шрифтов. Оставьте ее закомментированной, если вдруг капча не будет формироваться при тестировании, а в логе ошибок Apache будет появляться ошибка \"imagettftext(): Could not find/open font\", попробуйте ее раскомментировать:

//putenv( \'GDFONTPATH=\' . realpath(\'.\') );
Инициализируем переменную, в которой будет содержаться текстовое значение капчи:

$captcha = \'\';
Далее организовывается цикл с количеством итераций равным длине капчи (caplen):

for ($i = 0; $i < $caplen; $i++)
На каждом шаге цикла генерируется очередной символ капчи и рисуется на изображении. Берем случайный символ из нашего алфавита и добавляем его в капчу:

$captcha .= $letters[ rand(0, strlen($letters)-1) ];

6.
KoSh * 0.96
(30 янв 2013, 05:07) [0/0] [0] [отв] [спам] [под] +1 | -1

Вычисляем положение сгенерированного символа на изображении по оси x:

$x = ($width - 20) / $caplen * $i + 10;
Это положение зависит от ширины изображения, длины капчи и порядкового номера символа. Далее мы добавляем немного \"случайности\" в это положение:

$x = rand($x, $x+4);
Вычисляем положение сгенерированного символа на изображении по оси y:

$y = $height - ( ($height - $fontsize) / 2 );
Положение зависит от размера шрифта и высоты изображения.

Генерируем случайный цвет для символа. Этот цвет не должен быть слишком светлым, поэтому каждый из компонентов цвета (R, G и B) генерируем в диапазоне 0-100:

$curcolor = imagecolorallocate( $im, rand(0, 100), rand(0, 100), rand(0, 100) );
Для текущего символа случайным образом генерируем его угол наклона в диапазоне -25..25 градусов, чтобы буквы на капче \"плясали\":

$angle = rand(-25, 25);
И, наконец, рисуем символ со всеми выше полученными характеристиками на изображении:

imagettftext($im, $fontsize, $angle, $x, $y, $curcolor, $font, $captcha[$i]);

7.
KoSh * 0.96
(30 янв 2013, 05:08) [0/0] [0] [отв] [спам] [под] +1 | -1

На этой строке оканчивается тело цикла. Когда цикл отработает, в переменной captcha будет содержаться текстовое значение капчи, а изображение im будет представлять из себя отрисованную капчу. Необходимо где-то сохранить значение капчи, чтобы основной скрипт, который использует ее, мог проверить значение пользователя. Лучшее для этого место — сессионная переменная. Инициализируем сессию и сохраняем значение капчи:

session_start();
$_SESSION[\'captcha\'] = $captcha;
Наконец, выводим сформированное изображение captcha:

imagepng($im);
И освобождаем память, выведенную под изображение:

imagedestroy($im);
Ниже вы можете увидеть демонстрацию работы полученной капчи (попробуйте обновить изображение)

8.
KoSh * 0.96
(30 янв 2013, 05:08) [0/0] [0] [отв] [спам] [под] +1 | -1

Мораль сей басня такова:
Гугл рулит.

9. [автор] (30 янв 2013, 09:13) [0/0] [0] [отв] [спам] [под] +1 | -1

Ясно

  • 1 из 1
Чтобы писать сообщения авторизируйтесь или пройдите регистрацию на сайте.
Подписаны: 1
Скачать тему | Файлы темы | Фильтр сообщений