Генерация арифметической капчи

Рецепт №111. Из книги «128 рецептов php»
Перейти к оглавлению

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

Пример:

// шрифт
$font = 'impact.ttf'; 
// Размер шрифта 
$fontsize = 20; 
// Размер капчи
$width = 120;
$height = 40;

// придумываем пример для капчи
$a = mt_rand(1, 19);
$b = mt_rand(1, 19);
$capchaText = $a . '+' . $b . '=';
// Ответ на пример
$capchaResult = $a + $b;

// создаем изображение
$img = imagecreatetruecolor($width, $height);  
// фон
$white = imagecolorallocate($img, 220, 220, 220); 
imagefill($img, 0, 0, $white); 
 
// Заполняем изображение символами
for ($i = 0; $i < strlen($capchaText); $i++){ 
    // Из списка символов, берем случайный символ 
    $litteral = $capchaText[$i];  
    // Вычисляем положение одного символа
    $x = ($width - 20) / strlen($capchaText) * $i +10; 
    $y = $height - (($height - $fontsize) / 2);     
    // Сгенерируем случайный цвет для символа. 
    $color = imagecolorallocate(
$img, rand(0, 150), 
rand(0, 150), rand(0, 150) 
  );  
    // Генерируем угол наклона символа 
    $naklon = rand(-10, 10); 
    // Рисуем один символ
    imagettftext(
$img, $fontsize, $naklon, $x, $y, 
$color, $font, $litteral
  ); 
}

// Добавим на капчу несколько рандомных полосок
for ($i = 0; $i < $countLine; $i++){ 
    // сгенерируем координаты для линии
    $part = $width/100; // длина картинки в процентах
  // x1 не больше чем до 30% картинки
    $x1 = mt_rand(0, round($part*30)); 
    $y1 = mt_rand(0, $height);
	  // x2 не меньше чем от 70% картики
    $x2 = mt_rand(round($part*70), round($part*100)); 
    $y2 = mt_rand(0, $height);
    // сгенерируем случайный цвет для линии
    $color = imagecolorallocate(
$img, rand(0, 150), 
rand(0, 150), rand(0, 150) 
  );  
    imageline ($img, $x1, $y1, $x2, $y2, $color);
}

// заголовок для браузера
header('Content-type: image/png'); 
// вывод капчи на страницу
imagepng($img);  
// чистим память
imagedestroy($img);
Рассказать друзьям:


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*