Файл: 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 $contents, ImagePipeline $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($mediaType, quality: $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;
}
}