简体   繁体   中英

codeigniter captcha helper is not increasing text font size

This seems a duplace question some how, but its not. Am asking the following :

  1. 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 ?

在此处输入图片说明

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:

验证码文件

Easier solution :)

1.Goto this file yourapplication -> system - helpers -> captcha_helper.php

2.Find the following line and apply change as you want ie 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 !!!!

According to the Codeigniter Captcha Helper documentation , the native GD font has a size limit. You have to specify your own font to change the size:

font_size defaults to 16, the native GD font has a size limit. Specify a “true type” font for bigger sizes.

In my case, I downloaded a font from Google Fonts, saved it in my public html directory under my assets folder, and changed the font path to:

'font_path'     => '../html/assets/fonts/Roboto-Black.ttf',
'font_size'     => 16,

And now I can change the font with the font_size attribute as expected.

I fixed this by adding texb.font which lies in the system/fonts folder. Actually the issue is of font path. Below is the code:

    $vals = array(
            'img_path'      => FCPATH.'uploads/captcha/',
            'img_url'       => base_url().'uploads/captcha/',
            'font_path'     => FCPATH.'system/fonts/texb.ttf',
            'img_width'     => '250',
            'img_height'    => 50,
            'expiration'    => 7200,
            'word_length'   => 4,
            'font_size'     => 40,
            'colors'        => array(
                    'background' => array(255, 255, 255),
                    'border' => array(255, 255, 255),
                    'text' => array(0, 0, 0),
                    'grid' => array(255, 40, 40)
            )
        );

Below is the result: Output

只需使用不同的字体文件然后 font_size 工作:

'font_path'     => dirname(FCPATH) . DIRECTORY_SEPARATOR .'fonts'. DIRECTORY_SEPARATOR .'Arial.ttf',

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM