Файл: vendor/intervention/image/src/Drivers/Imagick/Decoders/NativeObjectDecoder.php
Строк: 174
<?php
declare(strict_types=1);
namespace InterventionImageDriversImagickDecoders;
use Imagick;
use ImagickException;
use InterventionImageDriversImagickCore;
use InterventionImageDriversSpecializableDecoder;
use InterventionImageExceptionsDriverException;
use InterventionImageExceptionsImageDecoderException;
use InterventionImageExceptionsInvalidArgumentException;
use InterventionImageExceptionsStateException;
use InterventionImageImage;
use InterventionImageInterfacesImageInterface;
use InterventionImageInterfacesSpecializedInterface;
use InterventionImageModifiersOrientModifier;
use InterventionImageModifiersRemoveAnimationModifier;
class NativeObjectDecoder extends SpecializableDecoder implements SpecializedInterface
{
/**
* {@inheritdoc}
*
* @see DecoderInterface::supports()
*/
public function supports(mixed $input): bool
{
return $input instanceof Imagick;
}
/**
* {@inheritdoc}
*
* @see DecoderInterface::decode()
*
* @throws InvalidArgumentException
* @throws StateException
* @throws DriverException
* @throws ImageDecoderException
*/
public function decode(mixed $input): ImageInterface
{
if (!$input instanceof Imagick) {
throw new InvalidArgumentException('Image source must be an instance of Imagick');
}
// For some JPEG formats, the "coalesceImages()" call leads to an image
// completely filled with background color. The logic behind this is
// incomprehensible for me; could be an imagick bug.
try {
if ($input->getImageFormat() !== 'JPEG') {
$input = $input->coalesceImages();
}
} catch (ImagickException $e) {
throw new DriverException('Failed to coalesce image', previous: $e);
}
// turn images with colorspace 'GRAY' into 'SRGB' to avoid working on
// grayscale colorspace images as this results images loosing color
// information when placed into this image.
try {
if ($input->getImageColorspace() === Imagick::COLORSPACE_GRAY) {
$input->setImageColorspace(Imagick::COLORSPACE_SRGB);
}
} catch (ImagickException $e) {
throw new DriverException('Failed to convert image to sRGB', previous: $e);
}
// create image object
$image = new Image($this->driver(), new Core($input));
// If autoOrientation is disabled, automatic image alignment should be prevented.
// Therefore, it is set to "undefined" here. To still be able to correct the
// orientation manually later, we save the original value.
if ($this->driver()->config()->autoOrientation === false) {
try {
$image->core()->meta()->set('originalImageOrientation', $input->getImageOrientation());
$input->setImageOrientation(Imagick::ORIENTATION_UNDEFINED);
} catch (ImagickException $e) {
throw new ImageDecoderException(
'Failed to set adjust image orientation',
previous: $e,
);
}
}
// discard animation depending on config
if (!$this->driver()->config()->decodeAnimation) {
$image->modify(new RemoveAnimationModifier());
}
// adjust image rotation
if ($this->driver()->config()->autoOrientation) {
$image->modify(new OrientModifier());
}
// set media type on origin
try {
$image->origin()->setMediaType($input->getImageMimeType());
} catch (ImagickException $e) {
throw new ImageDecoderException('Failed to retrieve image media type', previous: $e);
}
return $image;
}
}