211 lines
7.2 KiB
PHP
211 lines
7.2 KiB
PHP
|
<?php
|
|||
|
class captcha{
|
|||
|
var $alphabet = "0123456789"; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!
|
|||
|
var $fontsdir = 'fonts';
|
|||
|
var $width = 120;
|
|||
|
var $height = 50;
|
|||
|
var $fluctuation_amplitude = 2;
|
|||
|
var $no_spaces = false;
|
|||
|
var $jpeg_quality = 70; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 70-80
|
|||
|
var $keystring = ''; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
var $allowed_symbols = "0123456789"; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
var $length_min = 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
var $length_max = 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
var $length = 0; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
function genstring() {
|
|||
|
$length = mt_rand( $this->length_min, $this->length_max );
|
|||
|
$this->length = $length;
|
|||
|
$this->keystring = '';
|
|||
|
for ($i = 0; $i < $length ; $i++) {
|
|||
|
// <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
$this->keystring .= $this->allowed_symbols{ mt_rand( 0, strlen( $this->allowed_symbols ) -1 ) };
|
|||
|
}}
|
|||
|
|
|||
|
function genimage() {
|
|||
|
$foreground_color = array( 100, 130, 200 );
|
|||
|
$background_color = array( 255, 255, 255 );
|
|||
|
$fonts = array();
|
|||
|
$fontsdir_absolute = dirname( __FILE__ ).'/'.$this->fontsdir; // <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ($handle = opendir( $fontsdir_absolute )) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
while (false !== ($file = readdir( $handle ))) {
|
|||
|
if (preg_match( '/\.png$/i', $file )) {
|
|||
|
$fonts[] = $fontsdir_absolute.'/'.$file;
|
|||
|
}}
|
|||
|
closedir( $handle );
|
|||
|
}
|
|||
|
|
|||
|
$alphabet_length = strlen( $this->alphabet );
|
|||
|
|
|||
|
while (true) {
|
|||
|
$font_file = $fonts[mt_rand( 0, count( $fonts ) - 1 )];
|
|||
|
$font = imagecreatefrompng( $font_file );
|
|||
|
$black = imagecolorallocate( $font, 0, 0, 0 );
|
|||
|
$fontfile_width = imagesx( $font );
|
|||
|
$fontfile_height = imagesy( $font ) - 1;
|
|||
|
$font_metrics = array();
|
|||
|
$symbol = 0;
|
|||
|
$reading_symbol = false;
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
for ($i = 0; $i < $fontfile_width && $symbol < $alphabet_length; $i++) {
|
|||
|
$transparent = (imagecolorat( $font, $i, 0 ) >> 24) == 127;
|
|||
|
|
|||
|
if (!$reading_symbol && !$transparent) {
|
|||
|
$font_metrics[$this->alphabet{$symbol}] = array( 'start' => $i );
|
|||
|
$reading_symbol = true;
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
if ($reading_symbol && $transparent) {
|
|||
|
$font_metrics[$this->alphabet{$symbol}]['end'] = $i;
|
|||
|
$reading_symbol = false;
|
|||
|
$symbol++;
|
|||
|
continue;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
$img = imagecreatetruecolor( $this->width, $this->height );
|
|||
|
|
|||
|
$white = imagecolorallocate( $img, 100, 130, 200 );
|
|||
|
$black = imagecolorallocate( $img, 100, 130, 200 );
|
|||
|
|
|||
|
imagefilledrectangle( $img, 0, 0, $this->width - 1, $this->height - 1, $white );
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
$x = 1;
|
|||
|
$shift = 0;
|
|||
|
|
|||
|
for ($i = 0; $i < $this->length; $i++) {
|
|||
|
$m = $font_metrics[$this->keystring{$i}];
|
|||
|
$y = mt_rand( -$this->fluctuation_amplitude, $this->fluctuation_amplitude ) + ($this->height - $fontfile_height) / 2 + 2;
|
|||
|
|
|||
|
if ($this->no_spaces) {
|
|||
|
$shift = 0;
|
|||
|
if ($i > 0) {
|
|||
|
$shift = 1000;
|
|||
|
for ($sy = 1; $sy < $fontfile_height - 15; $sy += 2) {
|
|||
|
for ($sx = $m['start'] - 1; $sx < $m['end']; $sx++) {
|
|||
|
$rgb = imagecolorat( $font, $sx, $sy );
|
|||
|
$opacity = $rgb >> 24;
|
|||
|
if ($opacity < 127) {
|
|||
|
$left = $sx - $m['start'] + $x;
|
|||
|
$py = $sy + $y;
|
|||
|
for ($px = min( $left, $this->width - 1 ); $px > $left - 20 && $px >= 0; $px--) {
|
|||
|
$color = imagecolorat( $img, $px, $py ) & 0xff;
|
|||
|
if ($color + $opacity < 190) {
|
|||
|
if ($shift > $left-$px) {
|
|||
|
$shift = $left - $px;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
} else {$shift = 1;}
|
|||
|
imagecopy( $img, $font, $x - $shift, $y, $m['start'], 1, $m['end'] - $m['start'], $fontfile_height );
|
|||
|
$x += $m['end'] - $m['start'] - $shift;
|
|||
|
}
|
|||
|
if ($x < $this->width - 10) break; // fit in canvas
|
|||
|
}
|
|||
|
$center = $x/2;
|
|||
|
|
|||
|
$img2=imagecreatetruecolor($this->width, $this->height);
|
|||
|
$foreground=imagecolorallocate($img2, $foreground_color[0], $foreground_color[1], $foreground_color[2]);
|
|||
|
$background=imagecolorallocate($img2, $background_color[0], $background_color[1], $background_color[2]);
|
|||
|
imagefilledrectangle($img2, 0, $this->height, $this->width, $this->height+12, $foreground);
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
$rand1 = 0;
|
|||
|
$rand2 = 0;
|
|||
|
$rand3 = 0;
|
|||
|
$rand4 = 0;
|
|||
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
$rand5 = 0;
|
|||
|
$rand6 = 0;
|
|||
|
$rand7 = 0;
|
|||
|
$rand8 = 0;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
$rand9 = 0;
|
|||
|
$rand10 = 0;
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
for ($x = 0; $x < $this->width; $x++) {
|
|||
|
for ($y = 0; $y < $this->height; $y++) {
|
|||
|
$sx = $x + (sin( $x * $rand1 + $rand5 ) + sin( $y * $rand3 + $rand6 )) * $rand9 - $this->width / 2 + $center + 1;
|
|||
|
$sy = $y + (sin( $x * $rand2 + $rand7 ) + sin( $y * $rand4 + $rand8 )) * $rand10;
|
|||
|
|
|||
|
if ($sx < 0 || $sy < 0 || $sx >= $this->width - 1 || $sy >= $this->height - 1) {
|
|||
|
$color = 200;
|
|||
|
$color_x = 200;
|
|||
|
$color_y = 200;
|
|||
|
$color_xy = 200;
|
|||
|
} else {
|
|||
|
$color = imagecolorat( $img, $sx, $sy ) & 0xFF;
|
|||
|
$color_x = imagecolorat( $img, $sx + 1, $sy ) & 0xFF;
|
|||
|
$color_y = imagecolorat( $img, $sx, $sy + 1 ) & 0xFF;
|
|||
|
$color_xy = imagecolorat( $img, $sx + 1, $sy + 1 ) & 0xFF;
|
|||
|
}
|
|||
|
|
|||
|
if ($color == 0 && $color_x == 0 && $color_y == 0 && $color_xy == 0) {
|
|||
|
$newred = $foreground_color[0];
|
|||
|
$newgreen = $foreground_color[1];
|
|||
|
$newblue = $foreground_color[2];
|
|||
|
} else if ($color == 255 && $color_x == 255 && $color_y == 255 && $color_xy == 255) {
|
|||
|
$newred = $background_color[0];
|
|||
|
$newgreen = $background_color[1];
|
|||
|
$newblue = $background_color[2];
|
|||
|
} else {
|
|||
|
$frsx = $sx - floor( $sx );
|
|||
|
$frsy = $sy - floor( $sy );
|
|||
|
$frsx1 = 1 - $frsx;
|
|||
|
$frsy1 = 1 - $frsy;
|
|||
|
$newcolor = (
|
|||
|
$color * $frsx1 * $frsy1 +
|
|||
|
$color_x * $frsx * $frsy1 +
|
|||
|
$color_y * $frsx1 * $frsy +
|
|||
|
$color_xy * $frsx * $frsy);
|
|||
|
|
|||
|
if ($newcolor > 255) $newcolor = 255;
|
|||
|
$newcolor = $newcolor / 255;
|
|||
|
$newcolor0 = 1 - $newcolor;
|
|||
|
|
|||
|
$newred = $newcolor0 * $foreground_color[0] + $newcolor * $background_color[0];
|
|||
|
$newgreen = $newcolor0 * $foreground_color[1] + $newcolor * $background_color[1];
|
|||
|
$newblue = $newcolor0 * $foreground_color[2] + $newcolor * $background_color[2];
|
|||
|
}
|
|||
|
imagesetpixel( $img2, $x, $y, imagecolorallocate( $img2, $newred, $newgreen, $newblue ) );
|
|||
|
}}
|
|||
|
|
|||
|
# <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
imageline( $img2, 0, 0, $this->width, 0, $foreground );
|
|||
|
imageline( $img2, 0, 0, 0, $this->height, $foreground );
|
|||
|
|
|||
|
imageline( $img2, 0, $this->height-1, $this->width, $this->height-1, $foreground );
|
|||
|
imageline( $img2, $this->width-1, 0, $this->width-1, $this->height, $foreground);
|
|||
|
|
|||
|
header( "Expires: Tue, 11 Jun 1985 05:00:00 GMT" );
|
|||
|
header( "Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . " GMT" );
|
|||
|
header( "Cache-Control: no-store, no-cache, must-revalidate" );
|
|||
|
header( "Cache-Control: post-check=0, pre-check=0", false );
|
|||
|
header( "Pragma: no-cache" );
|
|||
|
|
|||
|
if (function_exists ('imagepng')) {
|
|||
|
header ('Content-type: image/png');
|
|||
|
imagepng ($img2, null);
|
|||
|
} elseif (function_exists ('imagegif')) {
|
|||
|
header ('Content-type: image/gif');
|
|||
|
imagegif ($img2, null);
|
|||
|
} elseif (function_exists('imagejpeg')) {
|
|||
|
header( "Content-Type: image/jpeg" );
|
|||
|
imagejpeg($img2, null, $this->jpeg_quality);
|
|||
|
}
|
|||
|
|
|||
|
imagedestroy($img2);
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
?>
|