codeigniter captcha helper is not increasing text font size
Solution 1
Easier solution :)
1.Goto this file yourapplication
->system
-helpers
->captcha_helper.php
2.Find the following line and apply change as you want i.e we change font size of the default captcha font size helpers settings.
NB.You can move the entier file to you application/core and suffix the file with MY.
$font_size = 28; //edited font for captcha size modification
// -----------------------------------
// Write the text
// -----------------------------------
$use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE;
if ($use_font == FALSE)
{
$font_size = 5;
$x = rand(0, $img_width/($length/3));
$y = 0;
}
else
{
$font_size = 28; //edited font for captcha size
$x = rand(0, $img_width/($length/1.5));
$y = $font_size+2;
}
3.Clear catch on your testing browser 4.Modify helper configuration on your controller or other places like FCPATH IS A MUST Thanks machineaddict!
$capache_config = array(
'img_path' => 'captcha/',
'img_url' => base_url() . 'captcha/',
'img_width' => '290',
'font_path' => FCPATH . 'captcha/font/captcha4.ttf',
'img_height' => 65,
'expiration' => 7200
);
Expected Output :
BANG BANG I HIT THE GROUND !!!!
Solution 2
Codeigniter captcha helper doesn't allow to change the font size. The following will replace the default create_captcha
function and allow you to change the font size. The CodeIgniter version I have used is 2.2.0. This is working/tested code.
Step 1: Create a new helper file named MY_captcha_helper.php
and save it under at the root of CodeIgniter folder in application/helper
. Content of the file:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* CodeIgniter
*
* An open source application development framework for PHP 5.1.6 or newer
*
* @package CodeIgniter
* @author ExpressionEngine Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
* @license http://codeigniter.com/user_guide/license.html
* @link http://codeigniter.com
* @since Version 1.0
* @filesource
*/
// ------------------------------------------------------------------------
/**
* CodeIgniter CAPTCHA Helper
*
* @package CodeIgniter
* @subpackage Helpers
* @category Helpers
* @author ExpressionEngine Dev Team
* @link http://codeigniter.com/user_guide/helpers/xml_helper.html
*/
// ------------------------------------------------------------------------
/**
* Create CAPTCHA
*
* @access public
* @param array array of data for the CAPTCHA
* @param string path to create the image in
* @param string URL to the CAPTCHA image folder
* @param string server path to font
* @return string
*/
if ( ! function_exists('create_captcha'))
{
function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = '')
{
$defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200, 'font_size' => 5);
foreach ($defaults as $key => $val)
{
if ( ! is_array($data))
{
if ( ! isset($$key) OR $$key == '')
{
$$key = $val;
}
}
else
{
$$key = ( ! isset($data[$key])) ? $val : $data[$key];
}
}
if ($img_path == '' OR $img_url == '')
{
return FALSE;
}
if ( ! @is_dir($img_path))
{
return FALSE;
}
if ( ! is_writable($img_path))
{
return FALSE;
}
if ( ! extension_loaded('gd'))
{
return FALSE;
}
// -----------------------------------
// Remove old images
// -----------------------------------
list($usec, $sec) = explode(" ", microtime());
$now = ((float)$usec + (float)$sec);
$current_dir = @opendir($img_path);
while ($filename = @readdir($current_dir))
{
if ($filename != "." and $filename != ".." and $filename != "index.html")
{
$name = str_replace(".jpg", "", $filename);
if (($name + $expiration) < $now)
{
@unlink($img_path.$filename);
}
}
}
@closedir($current_dir);
// -----------------------------------
// Do we have a "word" yet?
// -----------------------------------
if ($word == '')
{
$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$str = '';
for ($i = 0; $i < 8; $i++)
{
$str .= substr($pool, mt_rand(0, strlen($pool) -1), 1);
}
$word = $str;
}
// -----------------------------------
// Determine angle and position
// -----------------------------------
$length = strlen($word);
$angle = ($length >= 6) ? rand(-($length-6), ($length-6)) : 0;
$x_axis = rand(6, (360/$length)-16);
$y_axis = ($angle >= 0 ) ? rand($img_height, $img_width) : rand(6, $img_height);
// -----------------------------------
// Create image
// -----------------------------------
// PHP.net recommends imagecreatetruecolor(), but it isn't always available
if (function_exists('imagecreatetruecolor'))
{
$im = imagecreatetruecolor($img_width, $img_height);
}
else
{
$im = imagecreate($img_width, $img_height);
}
// -----------------------------------
// Assign colors
// -----------------------------------
$bg_color = imagecolorallocate ($im, 255, 255, 255);
$border_color = imagecolorallocate ($im, 153, 102, 102);
$text_color = imagecolorallocate ($im, 204, 153, 153);
$grid_color = imagecolorallocate($im, 255, 182, 182);
$shadow_color = imagecolorallocate($im, 255, 240, 240);
// -----------------------------------
// Create the rectangle
// -----------------------------------
ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $bg_color);
// -----------------------------------
// Create the spiral pattern
// -----------------------------------
$theta = 1;
$thetac = 7;
$radius = 16;
$circles = 20;
$points = 32;
for ($i = 0; $i < ($circles * $points) - 1; $i++)
{
$theta = $theta + $thetac;
$rad = $radius * ($i / $points );
$x = ($rad * cos($theta)) + $x_axis;
$y = ($rad * sin($theta)) + $y_axis;
$theta = $theta + $thetac;
$rad1 = $radius * (($i + 1) / $points);
$x1 = ($rad1 * cos($theta)) + $x_axis;
$y1 = ($rad1 * sin($theta )) + $y_axis;
imageline($im, $x, $y, $x1, $y1, $grid_color);
$theta = $theta - $thetac;
}
// -----------------------------------
// Write the text
// -----------------------------------
$use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE;
if ($use_font == FALSE)
{
$font_size = $font_size != 5 ? $font_size : 5;
$x = rand(0, $img_width/($length/3));
$y = 0;
}
else
{
$font_size = $font_size != 5 ? $font_size : 16;
$x = rand(0, $img_width/($length/1.5));
$y = $font_size+2;
}
for ($i = 0; $i < strlen($word); $i++)
{
if ($use_font == FALSE)
{
$y = rand(0 , $img_height/2);
imagestring($im, $font_size, $x, $y, substr($word, $i, 1), $text_color);
$x += ($font_size*2);
}
else
{
$y = rand($img_height/2, $img_height-3);
imagettftext($im, $font_size, $angle, $x, $y, $text_color, $font_path, substr($word, $i, 1));
$x += $font_size;
}
}
// -----------------------------------
// Create the border
// -----------------------------------
imagerectangle($im, 0, 0, $img_width-1, $img_height-1, $border_color);
// -----------------------------------
// Generate the image
// -----------------------------------
$img_name = $now.'.jpg';
ImageJPEG($im, $img_path.$img_name);
$img = "<img src=\"$img_url$img_name\" width=\"$img_width\" height=\"$img_height\" style=\"border:0;\" alt=\" \" />";
ImageDestroy($im);
return array('word' => $word, 'time' => $now, 'image' => $img);
}
}
// ------------------------------------------------------------------------
/* End of file captcha_helper.php */
/* Location: ./system/heleprs/captcha_helper.php */
I have changed:
this
$defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200);
into this
$defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200, 'font_size' => 5);
and this
if ($use_font == FALSE)
{
$font_size = 5;
$x = rand(0, $img_width/($length/3));
$y = 0;
}
else
{
$font_size = 16;
$x = rand(0, $img_width/($length/1.5));
$y = $font_size+2;
}
into this
if ($use_font == FALSE)
{
$font_size = $font_size != 5 ? $font_size : 5;
$x = rand(0, $img_width/($length/3));
$y = 0;
}
else
{
$font_size = $font_size != 5 ? $font_size : 16;
$x = rand(0, $img_width/($length/1.5));
$y = $font_size+2;
}
Step 2: Create a folder named captcha
at the root of CodeIgniter folder (you might already have it) and give it permissions 755 under apache current user/group.
Step 3: Save your .ttf custom fonts under captcha/fonts
.
Step 4: Your controller code:
$this->load->helper('captcha');
$capache_config = array(
'img_path' => 'captcha/',
'img_url' => base_url() . 'captcha/',
'img_width' => 190,
'img_height' => 60,
'font_size' => 20,
'font_path' => FCPATH. 'captcha/font/verdana.ttf',
'expiration' => 7200
);
/* Generate the captcha */
$captcha = create_captcha($capache_config);
if ($captcha !== FALSE) {
echo $captcha['image'];
} else {
die('No captcha was created');
}
Step 5: Example output:
Daniel Adenew
Grails - The search is over. Founder of Amharic Ebook Search Engine. [MyWebiste] http://dancreativelabs.com/ profile for danielad at Stack Overflow, Q&A for professional and enthusiast programmers http://stackoverflow.com/users/flair/2281472.png [MyWebiste] http://dancreativelab.com/
Updated on June 12, 2022Comments
-
Daniel Adenew almost 2 years
This seems a duplace question some how, but its not. Am asking the following :
Does the codeingiter helper does have a font size increasing feature ? even if i passed the following array setting seems not change.
'font_size' => 36
2.The font i used has the following font sizes , but still no change to captcah size
So what is the matter ?
/* Setup config to pass into the create_captcha function */ $capache_config = array( 'img_path' => 'captcha/', 'img_url' => base_url() . 'captcha/', 'img_width' => '150', 'font_path' => base_url() . 'captcha/font/captcha4.ttf', 'img_height' => 40, 'expiration' => 7200 ); /* Generate the captcha */ $captcha = create_captcha($capache_config);
But the size is i can't get it larger even if i increased width or height ? Any thing you know about this ?
-
Daniel Adenew about 9 yearsBrilliant but i have the easier solution now :)
-
machineaddict about 9 yearsChanging system files is very bad practice. NEVER do it! You cannot upgrade CodeIgniter anymore, unexpected results can happen, etc. That's why extending CodeIgniter system classes, helper, etc exists.
-
Daniel Adenew about 9 yearsso move it to core folder on application folder your modification will replace the core folder in systems
-
Karan Thakkar about 9 yearsmuch better idea than hacking the core.