Вход Регистрация
Файл: vendor/laravel/framework/src/Illuminate/Image/Drivers/InterventionDriver.php
Строк: 384
<?php

namespace IlluminateImageDrivers;

use 
finfo;
use 
IlluminateContractsImageDriver;
use 
IlluminateImageImageException;
use 
IlluminateImageImageOutputOptions;
use 
IlluminateImageImagePipeline;
use 
IlluminateImageTransformationsBlur;
use 
IlluminateImageTransformationsContain;
use 
IlluminateImageTransformationsCover;
use 
IlluminateImageTransformationsCrop;
use 
IlluminateImageTransformationsFlipHorizontally;
use 
IlluminateImageTransformationsFlipVertically;
use 
IlluminateImageTransformationsGrayscale;
use 
IlluminateImageTransformationsOrient;
use 
IlluminateImageTransformationsResize;
use 
IlluminateImageTransformationsRotate;
use 
IlluminateImageTransformationsScale;
use 
IlluminateImageTransformationsSharpen;
use 
InterventionImageDirection;
use 
InterventionImageEncodersAvifEncoder;
use 
InterventionImageEncodersBmpEncoder;
use 
InterventionImageEncodersGifEncoder;
use 
InterventionImageEncodersJpegEncoder;
use 
InterventionImageEncodersMediaTypeEncoder;
use 
InterventionImageEncodersPngEncoder;
use 
InterventionImageEncodersWebpEncoder;
use 
InterventionImageImageManager;

abstract class 
InterventionDriver implements Driver
{
    
/**
     * The registered transformation handlers.
     *
     * @var array<class-string<IlluminateContractsImageTransformation>, callable>
     */
    
protected array $transformationHandlers = [];

    
/**
     * The Intervention image manager instance.
     */
    
protected ImageManager $manager;

    
/**
     * Create a new Intervention driver instance.
     */
    
public function __construct()
    {
        
$this->manager $this->createManager();
    }

    
/**
     * Create the underlying Intervention image manager.
     */
    
abstract protected function createManager(): ImageManager;

    
/**
     * Ensure Intervention Image is installed.
     *
     * @throws ImageException
     */
    
public function ensureRequirementsAreMet(): void
    
{
        if (! 
class_exists(ImageManager::class)) {
            throw new 
ImageException(
                
'Intervention Image is required to use this driver. '.
                
'You may install it via: composer require intervention/image:^4.0',
            );
        }
    }

    
/**
     * Process the given image contents with the specified pipeline.
     */
    
public function process(string $contentsImagePipeline $pipeline): string
    
{
        
$mimeType = (new finfo(FILEINFO_MIME_TYPE))->buffer($contents);

        if (! 
in_array($mimeType, ['image/jpeg''image/png''image/bmp''image/gif''image/webp'])) {
            throw new 
ImageException("The image format [{$mimeType}] is not supported.");
        }

        
$image $this->manager->decode($contents);

        foreach (
$pipeline->transformations as $transformation) {
            if (
$handler $this->transformationHandlerFor($transformation)) {
                
$image $handler($image$transformation);

                continue;
            }

            
$image match (true) {
                
$transformation instanceof Orient => $image->orient(),
                
$transformation instanceof Cover => $image->cover($transformation->width$transformation->height),
                
$transformation instanceof Contain => $image->contain($transformation->width$transformation->height$transformation->background),
                
$transformation instanceof Crop => $image->crop($transformation->width$transformation->height$transformation->x$transformation->y),
                
$transformation instanceof Resize => $image->resize($transformation->width$transformation->height),
                
$transformation instanceof Rotate => $image->rotate($transformation->angle$transformation->background),
                
$transformation instanceof Scale => $image->scaleDown($transformation->width$transformation->height),
                
$transformation instanceof Blur => $image->blur($transformation->amount),
                
$transformation instanceof Grayscale => $image->grayscale(),
                
$transformation instanceof Sharpen => $image->sharpen($transformation->amount),
                
$transformation instanceof FlipVertically => $image->flip(Direction::VERTICAL),
                
$transformation instanceof FlipHorizontally => $image->flip(Direction::HORIZONTAL),
                default => throw new 
ImageException('The image transformation ['.get_class($transformation).'] is not supported.'),
            };
        }

        
$quality $pipeline->output->quality ?? ImageOutputOptions::DEFAULT_QUALITY;

        try {
            if (
$pipeline->output->format !== null) {
                return 
$image->encode(match ($pipeline->output->format) {
                    
'webp' => new WebpEncoder($quality),
                    
'jpg''jpeg' => new JpegEncoder($quality),
                    
'png' => new PngEncoder,
                    
'gif' => new GifEncoder,
                    
'avif' => new AvifEncoder($quality),
                    
'bmp' => new BmpEncoder,
                })->
toString();
            }

            
$mediaType match ($image->origin()->mediaType()) {
                
'image/x-gif' => 'image/gif',
                default => 
null,
            };

            return 
$image->encode(new MediaTypeEncoder($mediaTypequality$quality))->toString();
        } finally {
            unset(
$image);
        }
    }

    
/**
     * Register a transformation handler.
     *
     * @param  class-string<IlluminateContractsImageTransformation>  $transformation
     */
    
public function transformUsing(string $transformation, callable $callback): static
    {
        
$this->transformationHandlers[$transformation] = $callback;

        return 
$this;
    }

    
/**
     * Get the handler for the given transformation.
     */
    
protected function transformationHandlerFor(object $transformation): ?callable
    {
        foreach (
$this->transformationHandlers as $class => $handler) {
            if (
$transformation instanceof $class) {
                return 
$handler;
            }
        }

        return 
null;
    }
}
Онлайн: 2
Реклама