Вход Регистрация
Файл: vendor/intervention/image/src/Drivers/Imagick/Driver.php
Строк: 209
<?php

declare(strict_types=1);

namespace 
InterventionImageDriversImagick;

use 
Imagick;
use 
ImagickException;
use 
ImagickPixel;
use 
ImagickPixelException;
use 
InterventionImageDriversAbstractDriver;
use 
InterventionImageExceptionsDriverException;
use 
InterventionImageExceptionsMissingDependencyException;
use 
InterventionImageExceptionsInvalidArgumentException;
use 
InterventionImageFormat;
use 
InterventionImageFileExtension;
use 
InterventionImageImage;
use 
InterventionImageInterfacesColorProcessorInterface;
use 
InterventionImageInterfacesCoreInterface;
use 
InterventionImageInterfacesFontProcessorInterface;
use 
InterventionImageInterfacesImageInterface;
use 
InterventionImageMediaType;

class 
Driver extends AbstractDriver
{
    
/**
     * {@inheritdoc}
     *
     * @see DriverInterface::id()
     */
    
public function id(): string
    
{
        return 
'Imagick';
    }

    
/**
     * {@inheritdoc}
     *
     * @see DriverInterface::checkHealth()
     *
     * @codeCoverageIgnore
     */
    
public function checkHealth(): void
    
{
        if (!
extension_loaded('imagick') || !class_exists('Imagick')) {
            throw new 
MissingDependencyException(
                
'Imagick PHP extension must be installed to use this driver',
            );
        }
    }

    
/**
     * {@inheritdoc}
     *
     * @see DriverInterface::createImage()
     *
     * @throws InvalidArgumentException
     * @throws DriverException
     */
    
public function createImage(int $widthint $height): ImageInterface
    
{
        if (
$width || $height 1) {
            throw new 
InvalidArgumentException('Invalid image size. Only use int<1, max>');
        }

        try {
            
$background = new ImagickPixel('rgba(255, 255, 255, 0)');

            
$imagick = new Imagick();
            
$imagick->newImage($width$height$background'png');
            
$this->applyDefaultSettings($imagick);
        } catch (
ImagickException ImagickPixelException $e) {
            throw new 
DriverException('Failed to create new image'previous$e);
        }

        return new 
Image($this, new Core($imagick));
    }

    
/**
     * {@inheritdoc}
     *
     * @see DriverInterface::createCore()
     *
     * @throws DriverException
     */
    
public function createCore(array $frames): CoreInterface
    
{
        try {
            
$core = new Core(new Imagick());
        } catch (
ImagickException $e) {
            throw new 
DriverException('Failed to create new core'previous$e);
        }

        foreach (
$frames as $frame) {
            
$core->add($frame);
        }

        
$this->applyDefaultSettings($core->native());

        return 
$core;
    }

    
/**
     * {@inheritdoc}
     *
     * @see DriverInterface::colorProcessor()
     */
    
public function colorProcessor(ImageInterface $image): ColorProcessorInterface
    
{
        return new 
ColorProcessor($image->colorspace());
    }

    
/**
     * {@inheritdoc}
     *
     * @see DriverInterface::fontProcessor()
     */
    
public function fontProcessor(): FontProcessorInterface
    
{
        return new 
FontProcessor();
    }

    
/**
     * {@inheritdoc}
     *
     * @see DriverInterface::supports()
     */
    
public function supports(string|Format|FileExtension|MediaType $identifier): bool
    
{
        try {
            
$format Format::create($identifier);
        } catch (
InvalidArgumentException) {
            return 
false;
        }

        return 
count(Imagick::queryFormats($format->name)) >= 1;
    }

    
/**
     * Return version of ImageMagick library
     *
     * @throws DriverException
     */
    
public function version(): string
    
{
        
$pattern '/^ImageMagick (?P<version>(0|[1-9]d*).(0|[1-9]d*).(0|[1-9]d*)' .
            
'(?:-((?:0|[1-9]d*|d*[a-zA-Z-][0-9a-zA-Z-]*)(?:.(?:0|[1-9]d*|d*[a-zA-Z-][0-9a-zA-Z-]*))*))?' .
            
'(?:+([0-9a-zA-Z-]+(?:.[0-9a-zA-Z-]+)*))?)/';

        if (
preg_match($patternImagick::getVersion()['versionString'], $matches) !== 1) {
            throw new 
DriverException('Unable to read ImageMagick version number');
        }

        return 
$matches['version'];
    }

    
/**
     * Apply default settings for native image object.
     *
     * @throws DriverException
     */
    
private function applyDefaultSettings(Imagick $imagick): Imagick
    
{
        try {
            
$background = new ImagickPixel('rgba(255, 255, 255, 0)');

            
$imagick->setType(Imagick::IMGTYPE_UNDEFINED);
            
$imagick->setImageType(Imagick::IMGTYPE_UNDEFINED);
            
$imagick->setColorspace(Imagick::COLORSPACE_SRGB);
            
$imagick->setImageResolution(7272);
            
$imagick->setImageUnits(Imagick::RESOLUTION_PIXELSPERINCH);
            
$imagick->setImageBackgroundColor($background);
            
$imagick->setImageIterations(0);

            return 
$imagick;
        } catch (
ImagickException ImagickPixelException $e) {
            throw new 
DriverException('Failed to apply default image settings'previous$e);
        }
    }
}
Онлайн: 2
Реклама