Еще один пост из серии "how to".
Продолжаем моучать ботов. Точнее не столько ботов, сколько php.
Попробуем изогнуть ранее созданное изображение. Нужно получить что-то такое:
<?php /* * Получить новое значение по x * @param int $x * @param int $y * @param int $maxX - ширина изображения * @param int $maxY - высота ихображения * @param int $amplitude - "амплитуда" смещения * @param int $degres - сколько "градусов" помещается в $maxY (для тригонометрической функции, определяет количество изгибов) */ function getX($x, $y, $maxX, $maxY, $amplitude = 1, $degres = 180) { static $cache = array(); if(!isset($cache[$y])) { $cache[$y] = $amplitude * sin(deg2rad(ceil($y * $degres / $maxY))) - $amplitude; } $x = $x + $cache[$y]; if($x > $maxX) { $x = $x - $maxX; } else if($x < 0) { $x = $maxX + $x; } return $x; } /* * Изогнуть изображение * @param resource $im - ресурс изображения * @param int $amplitude - "амплитуда" смещения * @param int $degres - сколько "градусов" помещается в $maxY (для тригонометрической функции) */ function bendImage($im, $amplitude = 1, $degres = 180) { $captchaWidth = imagesx($im); $captchaHeight = imagesy($im); $rIm = imagecreatetruecolor($captchaWidth, $captchaHeight); for($i = 0; $i < $captchaWidth; ++$i) { for($j = 0; $j < $captchaHeight; ++$j) { $rgb = imagecolorat($im, $i, $j); imagesetpixel($rIm, getX($i, $j, $captchaWidth, $captchaHeight, $amplitude, $degres), $j, $rgb); } } return $rIm; }
Использование:
<?php $im = bendImage($im, 21, 180);
Не самая "ресурсосберегающая" операция.