diff --git a/Generator/CaptchaGenerator.php b/Generator/CaptchaGenerator.php new file mode 100644 index 0000000..38b40f5 --- /dev/null +++ b/Generator/CaptchaGenerator.php @@ -0,0 +1,127 @@ +value = $value; + } + + public function getCode() + { + return 'data:image/jpeg;base64,'.base64_encode($this->generate()); + } + + public function generate() + { + $i = imagecreatetruecolor(120,40); + $col = imagecolorallocate($i, mt_rand(0,110), mt_rand(0,110), mt_rand(0,110)); + + imagefill($i, 0, 0, 0xFFFFFF); + + // Draw random lines + for ($t=0; $t<10; $t++) { + $tcol = imagecolorallocate($i, 100+mt_rand(0,150), 100+mt_rand(0,150), 100+mt_rand(0,150)); + $Xa = mt_rand(0, 120); + $Ya = mt_rand(0, 40); + $Xb = mt_rand(0, 120); + $Yb = mt_rand(0, 40); + imageline($i, $Xa, $Ya, $Xb, $Yb, $tcol); + } + + // Write CAPTCHA text + imagettftext($i, 28, 0, 5, 32, $col, dirname(__FILE__).'/Font/captcha.ttf', $this->value); + + // Distort the image + $X = mt_rand(0, 120); + $Y = mt_rand(0, 40); + $Phase=mt_rand(0,10); + $Scale = 1.3 + mt_rand(0,10000)/30000; + $Amp=1+mt_rand(0,1000)/1000; + $out = imagecreatetruecolor(120,40); + + for ($x=0; $x<120; $x++) + for ($y=0; $y<40; $y++) { + $Vx=$x-$X; + $Vy=$y-$Y; + $Vn=sqrt($Vx*$Vx+$Vy*$Vy); + + if ($Vn!=0) { + $Vn2=$Vn+4*sin($Vn/8); + $nX=$X+($Vx*$Vn2/$Vn); + $nY=$Y+($Vy*$Vn2/$Vn); + } else { + $nX=$X; + $nY=$Y; + } + $nY = $nY+$Scale*sin($Phase + $nX*0.2); + + $p = $this->bilinearInterpolate($nX-floor($nX), $nY-floor($nY), + $this->getCol($i,floor($nX),floor($nY)), + $this->getCol($i,ceil($nX),floor($nY)), + $this->getCol($i,floor($nX),ceil($nY)), + $this->getCol($i,ceil($nX),ceil($nY))); + + if ($p==0) { + $p=0xFFFFFF; + } + + imagesetpixel($out, $x, $y, $p); + } + + // Renders it + ob_start(); + imagejpeg($out, null, 15); + return ob_get_clean(); + } + + function getCol($image, $x, $y) + { + $L = imagesx($image); + $H = imagesy($image); + if ($x<0 || $x>=$L || $y<0 || $y>=$H) + return 0xFFFFFF; + else return imagecolorat($image, $x, $y); + } + + function getRGB($col) { + return array( + (int)($col >> 16) & 0xff, + (int)($col >> 8) & 0xff, + (int)($col) & 0xff, + ); + } + + function bilinearInterpolate($x, $y, $nw, $ne, $sw, $se) + { + list($r0, $g0, $b0) = $this->getRGB($nw); + list($r1, $g1, $b1) = $this->getRGB($ne); + list($r2, $g2, $b2) = $this->getRGB($sw); + list($r3, $g3, $b3) = $this->getRGB($se); + + $cx = 1.0 - $x; + $cy = 1.0 - $y; + + $m0 = $cx * $r0 + $x * $r1; + $m1 = $cx * $r2 + $x * $r3; + $r = (int)($cy * $m0 + $y * $m1); + + $m0 = $cx * $g0 + $x * $g1; + $m1 = $cx * $g2 + $x * $g3; + $g = (int)($cy * $m0 + $y * $m1); + + $m0 = $cx * $b0 + $x * $b1; + $m1 = $cx * $b2 + $x * $b3; + $b = (int)($cy * $m0 + $y * $m1); + + return ($r << 16) | ($g << 8) | $b; + } +} + diff --git a/Generator/Font/captcha.ttf b/Generator/Font/captcha.ttf new file mode 100644 index 0000000..139f0b4 Binary files /dev/null and b/Generator/Font/captcha.ttf differ diff --git a/Resources/views/captcha.html.twig b/Resources/views/captcha.html.twig index 6df5f66..22ebfea 100644 --- a/Resources/views/captcha.html.twig +++ b/Resources/views/captcha.html.twig @@ -1,4 +1,4 @@ {% block captcha_widget %} - [{{ captcha_code }}]
+
{{ form_widget(form) }} {% endblock %} diff --git a/Type/CaptchaType.php b/Type/CaptchaType.php index a5deca5..94ff7cd 100755 --- a/Type/CaptchaType.php +++ b/Type/CaptchaType.php @@ -11,6 +11,7 @@ use Symfony\Component\Form\Exception\FormException; use Symfony\Component\HttpFoundation\Session; use Gregwar\CaptchaBundle\Validator\CaptchaValidator; +use Gregwar\CaptchaBundle\Generator\CaptchaGenerator; /** * Captcha type @@ -37,7 +38,9 @@ class CaptchaType extends AbstractType public function buildView(FormView $view, FormInterface $form) { - $view->set('captcha_code', $this->generateCaptchaValue()); + $generator = new CaptchaGenerator($this->generateCaptchaValue()); + + $view->set('captcha_code', $generator->getCode()); } public function getParent(array $options)