Вход Регистрация
Файл: engine/classes/Captcha.php
Строк: 117
<?php

class Captcha {

    
    public 
$width  150;
    public 
$height 60;
    public 
$minWordLength 3;
    public 
$maxWordLength 6;
    public 
$session_var 'captcha';
    public 
$backgroundColor = array(255255255);
    public 
$colors = array(
        array(
27,78,181),         array(22,163,35),         array(214,36,7),      );

    public 
$shadowColor null
    public 
$lineWidth 0;
    public 
$Yperiod    12;
    public 
$Yamplitude 14;
    public 
$Xperiod    11;
    public 
$Xamplitude 5;
    public 
$maxRotation 7;
    public 
$scale 2;
    public 
$blur false;
    public 
$debug false;
    public 
$im;
    public 
$font_config = array('spacing' => 1'minSize' => 17'maxSize' => 19);

    public function 
__construct($config = array()) {
    }

    public function 
CreateImage() {
        
$ini microtime(true);

        
        
$this->ImageAllocate();
        
        
        
$text $this->GetRandomCaptchaText();
        
$this->WriteText($text);

        
$_SESSION[$this->session_var] = $text;

        
        if (!empty(
$this->lineWidth)) {
            
$this->WriteLine();
        }
        
$this->WaveImage();
        if (
$this->blur && function_exists('imagefilter')) {
            
imagefilter($this->imIMG_FILTER_GAUSSIAN_BLUR);
        }
        
$this->ReduceImage();


        if (
$this->debug) {
            
imagestring($this->im11$this->height-8,
                
"$text ".round((microtime(true)-$ini), 4)."ms",
                
$this->GdFgColor
            
);
        }


        
        
$this->WriteImage();
    }


    
    protected function 
ImageAllocate() {
                if (!empty(
$this->im)) {
            
imagedestroy($this->im);
        }

        
$this->im imagecreatetruecolor($this->width*$this->scale$this->height*$this->scale);

                
$this->GdBgColor imagecolorallocate($this->im,
            
$this->backgroundColor[0],
            
$this->backgroundColor[1],
            
$this->backgroundColor[2]
        );
        
//imagecolortransparent($this->im, $this->GdBgColor);
        
imagefilledrectangle($this->im00$this->width*$this->scale$this->height*$this->scale$this->GdBgColor);

                
$color           $this->colors[mt_rand(0sizeof($this->colors)-1)];
        
$this->GdFgColor imagecolorallocate($this->im$color[0], $color[1], $color[2]);

                if (!empty(
$this->shadowColor) && is_array($this->shadowColor) && sizeof($this->shadowColor) >= 3) {
            
$this->GdShadowColor imagecolorallocate($this->im,
                
$this->shadowColor[0],
                
$this->shadowColor[1],
                
$this->shadowColor[2]
            );
        }
    }

    
    protected function 
GetRandomCaptchaText($length null) {
        if (empty(
$length)) {
            
$length rand($this->minWordLength$this->maxWordLength);
        }

        
$words  'bcdfghjlmnpqrstvwyz';
        
$vocals 'aeoui';

        
$text  null;
        
$vocal rand(01);
        while (
strlen($text) < $length)
        {
            if (
$vocal) {
                
$text .= substr($vocalsmt_rand(04), 1); //$vocals{mt_rand(0, 4)}; //
                
$vocal false;
            } else {
                
$text .= substr($wordsmt_rand(022), 1); //$words{mt_rand(0, 22)};
                
$vocal true;
            }
        }
        return 
$text;
    }


    
    protected function 
WriteLine() {

        
$x1 $this->width*$this->scale*.15;
        
$x2 $this->textFinalX;
        
$y1 rand($this->height*$this->scale*.40$this->height*$this->scale*.65);
        
$y2 rand($this->height*$this->scale*.40$this->height*$this->scale*.65);
        
$width $this->lineWidth/2*$this->scale;

        for (
$i $width*-1$i <= $width$i++) {
            
imageline($this->im$x1$y1+$i$x2$y2+$i$this->GdFgColor);
        }
    }




    
    protected function 
WriteText($text) {

        
$fontfile $_SERVER['DOCUMENT_ROOT'] . '/engine/files/data/font.ttf';
        
$lettersMissing $this->maxWordLength-strlen($text);
        
$fontSizefactor 1+($lettersMissing*0.09);

                
$x      20*$this->scale;
        
$y      round(($this->height*27/40)*$this->scale);
        
$length strlen($text);
        for (
$i=0$i<$length$i++) {
            
$degree   rand($this->maxRotation*-1$this->maxRotation);
            
$fontsize rand($this->font_config['minSize'], $this->font_config['maxSize'])*$this->scale*$fontSizefactor;
            
$letter   substr($text$i1);

            if (
$this->shadowColor) {
                
$coords imagettftext($this->im$fontsize$degree,
                    
$x+$this->scale$y+$this->scale,
                    
$this->GdShadowColor$fontfile$letter);
            }
            
$coords imagettftext($this->im$fontsize$degree,
                
$x$y,
                
$this->GdFgColor$fontfile$letter);
            
$x += ($coords[2]-$x) + ($this->font_config['spacing'] * $this->scale);
        }

        
$this->textFinalX $x;
    }

    
    protected function 
WaveImage() {
                
$xp $this->scale*$this->Xperiod*rand(1,3);
        
$k rand(0100);
        for (
$i 0$i < ($this->width*$this->scale); $i++) {
            
imagecopy($this->im$this->im,
                
$i-1sin($k+$i/$xp) * ($this->scale*$this->Xamplitude),
                
$i01$this->height*$this->scale);
        }

                
$k rand(0100);
        
$yp $this->scale*$this->Yperiod*rand(1,2);
        for (
$i 0$i < ($this->height*$this->scale); $i++) {
            
imagecopy($this->im$this->im,
                
sin($k+$i/$yp) * ($this->scale*$this->Yamplitude), $i-1,
                
0$i$this->width*$this->scale1);
        }
    }

    protected function 
ReduceImage() {
                
$imResampled imagecreatetruecolor($this->width$this->height);
        
imagecopyresampled($imResampled$this->im,
            
0000,
            
$this->width$this->height,
            
$this->width*$this->scale$this->height*$this->scale
        
);
        
imagedestroy($this->im);
        
$this->im $imResampled;
    }


    protected function 
WriteImage() {
        
header("Content-type: image/png");
        
imagepng($this->im);
        
imagedestroy($this->im);
    }
}
Онлайн: 1
Реклама