73 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php declare(strict_types=1);
 | 
						|
 | 
						|
namespace App\Captcha\Images;
 | 
						|
 | 
						|
use App\Captcha\Config\ImageHead as ImageHeadConfig;
 | 
						|
use App\Captcha\Contracts\ImageLines;
 | 
						|
use App\Captcha\Dto\Image as ImageDto;
 | 
						|
use App\Captcha\Dto\ImageHead as ImageHeadDto;
 | 
						|
use App\Captcha\Dto\Symbols;
 | 
						|
use App\Captcha\Contracts\ImageHead;
 | 
						|
use \App\Captcha\Contracts\Image as ImageContract;
 | 
						|
use App\Captcha\Enums\SymbolType;
 | 
						|
use App\Captcha\Contracts\ImageManager;
 | 
						|
 | 
						|
final class Head implements ImageHead
 | 
						|
{
 | 
						|
    public function __construct(
 | 
						|
        private readonly ImageManager $imageManager,
 | 
						|
        private readonly ImageLines $imageLines
 | 
						|
    ) { }
 | 
						|
 | 
						|
    public function processing(Symbols $symbols, ImageHeadConfig $config): ImageHeadDto
 | 
						|
    {
 | 
						|
        $image = $this->imageManager->createImage($config->getWidth(), $config->getHeight());
 | 
						|
        $image->insertBackground($config->randomBackground());
 | 
						|
 | 
						|
        $image = match ($symbols->getType()) {
 | 
						|
            SymbolType::String => $this->processingString($image, $symbols, $config),
 | 
						|
        };
 | 
						|
        if ($config->getNumberLines() > 0) {
 | 
						|
            $this->imageLines->processing(image: $image, colors: $config->getLineColors(), lines: $config->getNumberLines());
 | 
						|
        }
 | 
						|
 | 
						|
        $image = new ImageDto(
 | 
						|
            imageBase64: $image->encode(),
 | 
						|
            width: $image->getWidth(),
 | 
						|
            height: $image->getHeight()
 | 
						|
        );
 | 
						|
 | 
						|
        return new ImageHeadDto(image: $image);
 | 
						|
    }
 | 
						|
 | 
						|
    private function processingString(ImageContract $image, Symbols $symbols, ImageHeadConfig $config): Image
 | 
						|
    {
 | 
						|
        $textLeftPadding = $config->getTextPaddingLeft();
 | 
						|
        $textTopPadding  = $config->getTextPaddingTop();
 | 
						|
        $countSymbols    = count($symbols->getSuccess());
 | 
						|
        $widthPrefix     = $image->getWidth() - $textLeftPadding;
 | 
						|
        $imageHeight     = $image->getHeight() - $textTopPadding;
 | 
						|
 | 
						|
        foreach ($symbols->getSuccess() as $number => $symbol) {
 | 
						|
            $marginLeft = $textLeftPadding + $number * $widthPrefix / $countSymbols;
 | 
						|
 | 
						|
            $image->addText(
 | 
						|
                text:     $symbol,
 | 
						|
                x:        intval($marginLeft),
 | 
						|
                y:        $textTopPadding,
 | 
						|
                size:     $this->randomFontSize($imageHeight),
 | 
						|
                angle:    $config->randomAngle(),
 | 
						|
                hexColor: $config->randomFontColor(),
 | 
						|
                fontName: $config->randomFont()
 | 
						|
            );
 | 
						|
        }
 | 
						|
 | 
						|
        return $image;
 | 
						|
    }
 | 
						|
 | 
						|
    private function randomFontSize(int $imageHeight): int
 | 
						|
    {
 | 
						|
        return mt_rand($imageHeight - 10, $imageHeight);
 | 
						|
    }
 | 
						|
}
 |