Вход Регистрация
Файл: 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 $code, Options $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($image, 0, 0, 0, 127);

            if (
$color !== false) {
                
imagesavealpha($image, true);
                
imagefill($image, 0, 0, $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(0, count($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(0, count($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(-25, 25);
            
$capcolor = imagecolorallocate($image, random_int(0, 150), random_int(0, 150), random_int(0, 150));

            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 $string, string $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;
    }
}
Онлайн: 2
Реклама