Вход Регистрация
Файл: system/vendor/mobicms/captcha/src/Image.php
Строк: 166
<?php

/**
 * This file is part of mobicms/captcha library
 *
 * @copyright   Oleg Kasyanov <dev@mobicms.net>
 * @license     https://opensource.org/licenses/MIT MIT (see the LICENSE file)
 * @link        https://github.com/batumibiz/captcha
 */

declare(strict_types=1);

namespace 
MobicmsCaptcha;

use 
Exception;
use 
LogicException;

class 
Image
{
    
/** @var string */
    
private $code;

    
/** @var array */
    
private $fontList;

    
/** @var array */
    
private $options;

    public function 
__construct(string $codeOptions $options null)
    {
        
$this->code $code;
        
$optionsObj $options ?? new Options();
        
$this->options $optionsObj->getOptionsArray();
        
$fontList glob(realpath($this->options['fonts_folder']) . DIRECTORY_SEPARATOR '*.ttf');

        if ([] === 
$fontList || false === $fontList) {
            throw new 
LogicException('The specified folder does not contain any fonts.');
        }

        
$this->fontList $fontList;
    }

    
/**
     * @throws Exception
     */
    
public function __toString(): string
    
{
        return 
$this->generate();
    }

    
/**
     * @return string
     * @throws Exception
     */
    
public function generate(): string
    
{
        
ob_start();
        
$image imagecreatetruecolor($this->options['image_width'], $this->options['image_height']);

        if (
$image !== false) {
            
$color imagecolorallocatealpha($image000127);

            if (
$color !== false) {
                
imagesavealpha($imagetrue);
                
imagefill($image00$color);
                
$this->drawTextOnImage($image);
                
imagepng($image);
                
imagedestroy($image);
            }
        }

        
$out ob_get_clean();
        return 
'data:image/png;base64,' base64_encode((string) $out);
    }

    
/**
     * Drawing the text on the image
     *
     * @param resource $image
     * @throws Exception
     */
    
private function drawTextOnImage(&$image): void
    
{
        
$font $this->fontList[random_int(0count($this->fontList) - 1)];
        
$code str_split($this->code);
        
$len count($code);

        for (
$i 0$i $len$i++) {
            if (
$this->options['fonts_shuffle']) {
                
$font $this->fontList[random_int(0count($this->fontList) - 1)];
            }

            
$fontName basename($font);
            
$letter $this->setLetterCase($code[$i], $fontName);
            
$fontSize $this->determineFontSize($fontName);
            
$xPos = ($this->options['image_width'] - $fontSize) / $len $i + ($fontSize 2);
            
$xPos random_int((int) $xPos, (int) $xPos 5);
            
$yPos $this->options['image_height'] - (($this->options['image_height'] - $fontSize) / 2);
            
$capangle random_int(-2525);
            
$capcolor imagecolorallocate($imagerandom_int(0150), random_int(0150), random_int(0150));

            if (
$capcolor !== false) {
                
imagettftext($image$fontSize$capangle$xPos, (int) $yPos$capcolor$font$letter);
            }
        }
    }

    private function 
determineFontSize(string $fontName): int
    
{
        return isset(
$this->options['fonts_tuning'][$fontName])
            ? (int) 
$this->options['fonts_tuning'][$fontName]['size']
            : (int) 
$this->options['fonts_size'];
    }

    private function 
setLetterCase(string $stringstring $fontName): string
    
{
        if (isset(
$this->options['fonts_tuning'][$fontName])) {
            switch (
$this->options['fonts_tuning'][$fontName]['case']) {
                case 
Options::FONT_CASE_UPPER:
                    return 
strtoupper($string);
                case 
Options::FONT_CASE_LOWER:
                    return 
strtolower($string);
            }
        }

        return 
$string;
    }
}
Онлайн: 0
Реклама