# setings
$data = array(
# Ширина изображения
'width' => '90',
# Высота изображения
'height' => '40',
# Размер шрифта
'font_size' => '10',
# Отступ символов
'deltaX' => '18',
# Отступ сверху
'y' => '35',
# Отступ снгизу
'x' => '25',
# Шрифт
'path_fonts' => '../utils/fonts/default_font.ttf',
# Число символов на изображении
'letters' => 5
);
# Создание картинки
$im = imagecreatetruecolor($data['width'], $data['height']);
$black = imagecolorallocate($im, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
# сглаживание
imageantialias($im, true);
# Случайная строка
$randStr = substr(md5(uniqid()), 0, $data['letters']);
# Вносим в куки на 120 с.
$cookie = md5($randStr);
$cookietime = time()+120;
setcookie("captcha_code", $cookie, $cookietime);
# Записываем код в сессию
$_SESSION['captcha_code'] = $randStr;
$directions = array('horizontal', 'vertical');
# Цвета для градиента
$color1 = imagecolorallocate($im, mt_rand(100, 255), mt_rand(100, 255), mt_rand(150, 255));
$color2 = imagecolorallocate($im, mt_rand(100, 255), mt_rand(100, 255), mt_rand(150, 255));
# Нанесения рондомнорго градиента фона
if ( ! in_array($direction, $directions)) {
$direction = $directions[array_rand($directions)];
if (mt_rand(0, 1) === 1) {
$temp = $color1;
$color1 = $color2;
$color2 = $temp;
}
}
# Извлечение цвета
$color1 = imagecolorsforindex($im, $color1);
$color2 = imagecolorsforindex($im, $color2);
# Подготовка к градиенту
$steps = ($direction === 'horizontal') ? $data['width'] : $data['height'];
$r1 = ($color1['red'] - $color2['red']) / $steps;
$g1 = ($color1['green'] - $color2['green']) / $steps;
$b1 = ($color1['blue'] - $color2['blue']) / $steps;
if ($direction === 'horizontal') {
$x1 =& $i;
$y1 = 0;
$x2 =& $i;
$y2 = $data['height'];
} else {
$x1 = 0;
$y1 =& $i;
$x2 = $data['width'];
$y2 =& $i;
}
# Выполнение градиента
for ($i = 0; $i <= $steps; $i++) {
$r2 = $color1['red'] - floor($i * $r1);
$g2 = $color1['green'] - floor($i * $g1);
$b2 = $color1['blue'] - floor($i * $b1);
$color = imagecolorallocate($im, $r2, $g2, $b2);
imageline($im, $x1, $y1, $x2, $y2, $color);
}
# Добавляем линии на изображене
for ($i = 0, $count = mt_rand(5, 4 * 4); $i < $count; $i++) {
$color = imagecolorallocatealpha($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(100, 255), mt_rand(50, 120));
imageline($im, mt_rand(0, $data['width']), 0, mt_rand(0, $data['width']), $data['height'], $color);
}
# Наносим символы
for($i=0; $i <strlen($randStr); $i++) {
$size = rand($data['font_size']*2.1-2, $data['font_size']*2.1+2);
$angle = -30 + rand(0,60);
$x = ($i+1)*$data['font_size'] + rand(4, 7);
$y = (($data['height']*2)/3) + rand(0, 5);
$cod = $randStr{$i};
imagettftext($im, $size, $angle, $x, $y, $black, $data['path_fonts'], $cod);
$data['x'] += $data['deltaX'];
}
# Антикеширование
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
# Создание рисунка в зависимости от доступного формата
if (function_exists("imagepng")) {
header("Content-type: image/png");
imagepng($im);
} elseif (function_exists("imagegif")) {
header("Content-type: image/gif");
imagegif($im);
} elseif (function_exists("imagejpeg")) {
header("Content-type: image/jpeg");
imagejpeg($im, "", 175);
} else {
die("No image support in this PHP server!");
}
# Удаляем изображение
imagedestroy($im);