length_min, $this->length_max ); $this->length = $length; $this->keystring = ''; for ($i = 0; $i < $length ; $i++) { // в цикле добавляем к строке по 1 случайному символу $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; // путь к папке с шрифтами if ($handle = opendir( $fontsdir_absolute )) { // создаем массив с полными путями к изображениям с шрифтами 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; // загрузка шрифта 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 ); // нанесение текста $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); // периоды $rand1 = 0; $rand2 = 0; $rand3 = 0; $rand4 = 0; // фазы $rand5 = 0; $rand6 = 0; $rand7 = 0; $rand8 = 0; // амплитуды $rand9 = 0; $rand10 = 0; //волновое искажение 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 ) ); }} # Рамка 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); } } session_start(); $im = new genrandomimage(); $im->genstring(); $_SESSION['sec_code_session'] = $im->keystring; $im->genimage(); ?>