Капча (captcha) на php под Imagick
18.08.2009, 14:52
В связи с мистическими событиями, все GD скрипты приходится переписывать под Imagick.
Самое интересное, в сети практически не найти ни нормальной документации по нему, ни примеров (особенно на русском, но нам впринципе пох). Поэтому выложу свою капчу, которая использует простой алгоритм MultiSwirl, описанный на сайте captcha.ru.
// Это строка, которую мы будем рисовать на изображении
$str = rand(1000, 999999);
$_SESSION['captcha'] = $str;
/*
** Здесь можно указать путь к своему шрифту
** $font = dirname(__FILE__) . '/MyriadPro-Bold.otf';
*/
/*
** Задаем углы закручивания
** и сдвиг, относительно центра перед закручиванием
*/
$corner1 = rand(30,50);
$corner2 = rand(30,50);
$roll = rand(20, 50);
// Создаем объект
$image = new Imagick();
$draw = new ImagickDraw();
$image->newImage(150, 50, new ImagickPixel('#ffffff'));
/*
** Если используем свой шрифт, передаем его в ImageDraw
** $draw->setFont($font);
*/
// Задаем размер шрифта
$draw->setFontSize(40);
// Накладываем нашу надпись
$image->annotateImage($draw, 10, 40, 0, $str);
Далее пошло уже закручивание изображения: сначала в одну сторону, потом в другую.
// Двигаем изображение и закручиваем его
$image->rollImage($roll,0);
$image->swirlImage(-$corner1);
$image->rollImage(-$roll*2,0);
$image->swirlImage($corner2);
$image->rollImage($roll,0);
Ну и собственно, выдача:
$image->setImageFormat('png');
header('Content-type: image/png');
echo $image;
Как это выглядит:

Что можно еще:
1. поиграться с углами
2. поставить пизданутый шрифт
3. уменьшить межбуквенный интервал
4. выводить не только цифры
5. Добавить несколько полос и также свирлом вместе с символами