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)