325 lines
No EOL
9.7 KiB
PHP
325 lines
No EOL
9.7 KiB
PHP
<?php
|
|
|
|
if(!class_exists("files"))
|
|
{
|
|
require_once "class.files.php";
|
|
}
|
|
|
|
class img_validator extends files
|
|
{
|
|
/**
|
|
* Fonts folder
|
|
* @var string $folder
|
|
*/
|
|
var $folder;
|
|
/**
|
|
* Background images folder
|
|
* @var string $img_folder
|
|
*/
|
|
var $img_folder;
|
|
/**
|
|
* Letters limit for the given words
|
|
* @var integer $letters_limit
|
|
*/
|
|
var $letters_limit = 15;
|
|
/**
|
|
* The generated image will be JPEG or PNG?
|
|
* @var string $image_type
|
|
*/
|
|
var $image_type = "jpeg";
|
|
|
|
/**
|
|
* Colors themes for the GD generated images. They must be in RGB.
|
|
* The array must start at index 1
|
|
*
|
|
* 0 => background image color
|
|
* 1 => background image border
|
|
* 2 => text color
|
|
* @var array $themes
|
|
*/
|
|
var $themes = array (
|
|
1 => array(array(205, 255, 204), array(205, 255, 204), array(0, 0, 0)),
|
|
2 => array(array(255, 255, 203), array(255, 255, 203), array(0, 0, 0)),
|
|
3 => array(array(102, 203, 255), array(102, 203, 255), array(0, 0, 0)),
|
|
4 => array(array(0, 0, 0), array(82, 82, 82), array(255, 255, 255)),
|
|
5 => array(array(153, 1, 0), array(0, 0, 0), array(255, 255, 255)),
|
|
);
|
|
/**
|
|
* Colors themes for the done BG images
|
|
*
|
|
* 0 => background image name
|
|
* 1 => Red, 2 => Green, 3 => Blue
|
|
* @var array $themes
|
|
*/
|
|
var $themes_bg_images = array (
|
|
1 => array("bg1.jpg", 0, 0, 0),
|
|
2 => array("bg2.jpg", 0, 0, 0),
|
|
3 => array("bg3.jpg", 0, 0, 0),
|
|
4 => array("bg4.jpg", 0, 0, 0),
|
|
|
|
);
|
|
/**
|
|
* Fonts data
|
|
* 0 => font file,
|
|
* 1 => initial X position for a letter in size 14 texts
|
|
* 2 => initial X position for a letter in size 40 texts
|
|
* 3 => value to reduce of X each new letter in size 14 texts
|
|
* 4 => value to reduce of X each new letter in size 40 texts
|
|
*
|
|
* -> P.S.: The indexes 1, 2, 3 and 4 are used only when the text will be centralized
|
|
*/
|
|
var $fonts = array (
|
|
/* With this font, all letters are uppercase and the characters limit decrease
|
|
array("acmesab.ttf", 84, 62, 7.0, 18.0),*/
|
|
array("arial.ttf" , 85, 70, 5.1, 11.6),
|
|
array("verdana.ttf", 82, 67, 5.6, 12.9),
|
|
array("comicbd.ttf", 83, 68, 5.1, 11.5),
|
|
array("impact.ttf" , 80, 55, 5.7, 12.9)
|
|
);
|
|
/**
|
|
* Image Width
|
|
* @var integer $_width
|
|
*/
|
|
var $_width = 180;
|
|
/**
|
|
* Image Height
|
|
* @var integer $_height
|
|
*/
|
|
var $_height = 50;
|
|
|
|
/**
|
|
* Checks if the system has GD support
|
|
*
|
|
*/
|
|
function __construct($folder = false, $img_folder = false)
|
|
{
|
|
// If doesn't given, uses the default fonts folder
|
|
if(!$folder)
|
|
{
|
|
$folder = "./img/fonts/";
|
|
}
|
|
|
|
// If doesn't given, uses the default background images folder
|
|
if(!$img_folder)
|
|
{
|
|
$img_folder = "./img/";
|
|
}
|
|
|
|
// Sets the background images and fonts dir
|
|
$this->folder = $folder;
|
|
$this->img_folder = $img_folder;
|
|
|
|
// Checks if the system has GD loaded on PHP
|
|
if(!function_exists("ImageCreateTrueColor")) // gd 2.*
|
|
{
|
|
if(!function_exists("ImageCreate")) // gd 1.*
|
|
{
|
|
$this->_error("You can't run this script because your PHP doesn't have GD library (1.* or 2.*) loaded.", E_USER_ERROR);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Encrypts a word to record the data
|
|
*
|
|
* @param string $word
|
|
*/
|
|
function encrypts_word($word)
|
|
{
|
|
return substr(md5($word), 1, 10);
|
|
}
|
|
|
|
/**
|
|
* Record a word in SESSION
|
|
*
|
|
* @param string $word
|
|
*/
|
|
function records_word($word)
|
|
{
|
|
session_register('word_validator');
|
|
$_SESSION["word_validator"] = base64_encode($this->encrypts_word($word));
|
|
if(empty($_SESSION['word_validator'])){
|
|
setcookie('word_validator', base64_encode($this->encrypts_word($word)));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Checks the recorded word with the given on
|
|
*
|
|
* @param string $wordc
|
|
*/
|
|
function checks_word($word)
|
|
{
|
|
if(isset($_SESSION["word_validator"])){
|
|
$recorded = base64_decode($_SESSION["word_validator"]);
|
|
}else{
|
|
$recorded = base64_decode($_COOKIE["word_validator"]);
|
|
}
|
|
$given = $this->encrypts_word($word);
|
|
if(preg_match($given, $recorded))
|
|
{
|
|
$msg = true;
|
|
}
|
|
else
|
|
{
|
|
$msg = false;
|
|
}
|
|
return $msg;
|
|
}
|
|
|
|
/**
|
|
* Generates a random text, whether a word isn't give or
|
|
* the given word is more than the letters limit
|
|
*/
|
|
function generates_text()
|
|
{
|
|
$temp = md5(uniqid(microtime()));
|
|
$temp = hexdec($temp);
|
|
$word = substr($temp, 2, 3) . "-" . substr($temp, 6, 3);
|
|
|
|
return $word;
|
|
}
|
|
|
|
/**
|
|
* Generates the validation imagem with a given word.
|
|
* If the word isn't provide generate a random word.
|
|
*
|
|
* @param string $word
|
|
* @param boolean $use_done_images
|
|
* @param string $align
|
|
*/
|
|
function generates_image($word = false, $use_done_images = false, $align = "center")
|
|
{
|
|
/**
|
|
* Didn't give a word, generates a random text
|
|
*/
|
|
if(!$word)
|
|
{
|
|
$word = $this->generates_text();
|
|
}
|
|
else
|
|
{
|
|
$word_size = strlen($word);
|
|
|
|
if($word_size > $this->letters_limit)
|
|
{
|
|
$word = $this->generates_text();
|
|
}
|
|
}
|
|
|
|
$this->records_word($word);
|
|
$word_size = strlen($word);
|
|
|
|
srand((double) microtime() * 1000000);
|
|
|
|
/**
|
|
* Chooses a random font
|
|
*/
|
|
$fnt = rand(0, count($this->fonts)-1);
|
|
$font = $this->folder . $this->fonts[$fnt][0];
|
|
|
|
/**
|
|
* Sets the X values according to the chosen alignment
|
|
*/
|
|
if($align == "center")
|
|
{
|
|
/**
|
|
* X position value for only 1 letter of the size 14 text
|
|
*/
|
|
$x_small = $this->fonts[$fnt][1];
|
|
$d_small = $this->fonts[$fnt][3];
|
|
/**
|
|
* X position value for only 1 letter of the size 40 text
|
|
*/
|
|
$x_big = $this->fonts[$fnt][2];
|
|
$d_big = $this->fonts[$fnt][4];
|
|
|
|
/**
|
|
* For each letter of the given word, decreases $d_small of the size 14 text's X position
|
|
* and decreases $d_big of the size 40 text's X position.
|
|
* Remember: if you change the size of the background image, the font and the text's size
|
|
* you must manually recalculate those numbers ($d_small and $d_big),
|
|
* so the text will be always right centered
|
|
*/
|
|
for($i = 1; $i < $word_size; $x_small -= $d_small, $i++);
|
|
for($i = 1; $i < $word_size; $x_big -= $d_big, $i++);
|
|
}
|
|
/**
|
|
* Left
|
|
*/
|
|
else
|
|
{
|
|
$x_small = 2;
|
|
$x_big = 2;
|
|
}
|
|
|
|
srand((double) microtime() * 1000000);
|
|
|
|
/**
|
|
* The background is already done, so, create the image handle from done BG
|
|
*/
|
|
if($use_done_images)
|
|
{
|
|
// Chooses randomly a theme
|
|
$theme = rand(1, count($this->themes_bg_images));
|
|
// Start image handle from file
|
|
$background_image = ImageCreateFromJPEG($this->img_folder . $this->themes_bg_images[$theme][0]);
|
|
// Text's colors
|
|
$R = $this->themes_bg_images[$theme][1];
|
|
$G = $this->themes_bg_images[$theme][2];
|
|
$B = $this->themes_bg_images[$theme][3];
|
|
}
|
|
/**
|
|
* GD Creates the background rectangle
|
|
*/
|
|
else
|
|
{
|
|
// Chooses randomly a theme
|
|
$theme = rand(1, count($this->themes));
|
|
// Start image handle
|
|
$background_image = imagecreatetruecolor($this->_width, $this->_height);
|
|
// Alocates the rectangle's colors
|
|
$fill = ImageColorAllocate($background_image, $this->themes[$theme][0][0], $this->themes[$theme][0][1], $this->themes[$theme][0][2]);
|
|
$border = ImageColorAllocate($background_image, $this->themes[$theme][1][0], $this->themes[$theme][1][1], $this->themes[$theme][1][2]);
|
|
// Creates the rectangle
|
|
ImageFilledRectangle($background_image, 2, 2, 177, 47, $fill);
|
|
ImageRectangle($background_image, 0, 0, 179, 49, $border);
|
|
// Text's colors
|
|
$R = $this->themes[$theme][2][0];
|
|
$G = $this->themes[$theme][2][1];
|
|
$B = $this->themes[$theme][2][2];
|
|
}
|
|
|
|
/**
|
|
* Allocate the texts' colors
|
|
*/
|
|
$transp_color = imagecolorallocatealpha($background_image, $R, $G, $B, 100);
|
|
$color = imagecolorallocate($background_image, $R, $G, $B);
|
|
|
|
/**
|
|
* Writes the word with transparency in the background
|
|
*/
|
|
imagettftext($background_image, 40, 0, $x_big, 45, $transp_color, $font, $word);
|
|
/**
|
|
* Writes the main word
|
|
*/
|
|
imagettftext($background_image, 14, 0, $x_small, 30, $color, $font, $word);
|
|
|
|
/**
|
|
* Prints header and the image
|
|
*/
|
|
if($this->image_type == "jpeg")
|
|
{
|
|
header("Content-type: image/jpeg");
|
|
imagejpeg($background_image, false, 100);
|
|
}
|
|
else
|
|
{
|
|
header("Content-type: image/png");
|
|
imagepng($background_image);
|
|
}
|
|
|
|
imagedestroy($background_image);
|
|
}
|
|
}
|
|
?>
|