Файл: vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php
Строк: 183
<?php
declare(strict_types=1);
namespace InterventionImageDriversImagick;
use Imagick;
use ImagickException;
use ImagickPixel;
use ImagickPixelException;
use InterventionImageColorsCmykChannelsCyan;
use InterventionImageColorsCmykChannelsKey;
use InterventionImageColorsCmykChannelsMagenta;
use InterventionImageColorsCmykChannelsYellow;
use InterventionImageColorsCmykColorspace as Cmyk;
use InterventionImageColorsHslColorspace as Hsl;
use InterventionImageColorsHsvColorspace as Hsv;
use InterventionImageColorsOklabColorspace as Oklab;
use InterventionImageColorsOklchColorspace as Oklch;
use InterventionImageColorsRgbChannelsAlpha;
use InterventionImageColorsRgbChannelsBlue;
use InterventionImageColorsRgbChannelsGreen;
use InterventionImageColorsRgbChannelsRed;
use InterventionImageColorsRgbColorspace as Rgb;
use InterventionImageExceptionsDriverException;
use InterventionImageExceptionsInvalidArgumentException;
use InterventionImageExceptionsNotSupportedException;
use InterventionImageInterfacesColorInterface;
use InterventionImageInterfacesColorProcessorInterface;
use InterventionImageInterfacesColorspaceInterface;
class ColorProcessor implements ColorProcessorInterface
{
/**
* Create new instance.
*/
public function __construct(protected ColorspaceInterface $colorspace)
{
//
}
/**
* {@inheritdoc}
*
* @see ColorProcessorInterface::colorspace()
*/
public function colorspace(): ColorspaceInterface
{
return $this->colorspace;
}
/**
* @throws DriverException
*/
public function export(ColorInterface $color): ImagickPixel
{
$color = $this->colorspace->importColor($color);
if ($this->colorspace instanceof Cmyk) {
try {
$pixel = new ImagickPixel();
$pixel->setColorValue(Imagick::COLOR_CYAN, $color->channel(Cyan::class)->normalized());
$pixel->setColorValue(Imagick::COLOR_MAGENTA, $color->channel(Magenta::class)->normalized());
$pixel->setColorValue(Imagick::COLOR_YELLOW, $color->channel(Yellow::class)->normalized());
$pixel->setColorValue(Imagick::COLOR_BLACK, $color->channel(Key::class)->normalized());
} catch (ImagickException | ImagickPixelException $e) {
throw new DriverException('Failed to create CMYK color', previous: $e);
}
return $pixel;
}
$color = $color->toColorspace(Rgb::class);
try {
return new ImagickPixel(
sprintf(
"srgba(%s, %s, %s, %s)",
$color->channel(Red::class)->value(),
$color->channel(Green::class)->value(),
$color->channel(Blue::class)->value(),
$color->channel(Alpha::class)->toString(),
),
);
} catch (ImagickException | ImagickPixelException $e) {
throw new DriverException('Failed to create color', previous: $e);
}
}
/**
* @throws InvalidArgumentException
* @throws DriverException
* @throws NotSupportedException
*/
public function import(mixed $color): ColorInterface
{
if (!$color instanceof ImagickPixel) {
throw new InvalidArgumentException(
'Imagick driver can only process colors from instances of ' . ImagickPixel::class,
);
}
try {
return match ($this->colorspace::class) {
Cmyk::class => $this->colorspace->colorFromNormalized([
$color->getColorValue(Imagick::COLOR_CYAN),
$color->getColorValue(Imagick::COLOR_MAGENTA),
$color->getColorValue(Imagick::COLOR_YELLOW),
$color->getColorValue(Imagick::COLOR_BLACK),
]),
Rgb::class => $this->colorspace->colorFromNormalized([
$color->getColorValue(Imagick::COLOR_RED),
$color->getColorValue(Imagick::COLOR_GREEN),
$color->getColorValue(Imagick::COLOR_BLUE),
$color->getColorValue(Imagick::COLOR_ALPHA),
]),
Hsl::class => Rgb::class::colorFromNormalized([
$color->getColorValue(Imagick::COLOR_RED),
$color->getColorValue(Imagick::COLOR_GREEN),
$color->getColorValue(Imagick::COLOR_BLUE),
$color->getColorValue(Imagick::COLOR_ALPHA),
])->toColorspace(Hsl::class),
Hsv::class => Rgb::colorFromNormalized([
$color->getColorValue(Imagick::COLOR_RED),
$color->getColorValue(Imagick::COLOR_GREEN),
$color->getColorValue(Imagick::COLOR_BLUE),
$color->getColorValue(Imagick::COLOR_ALPHA),
])->toColorspace(Hsv::class),
Oklab::class => Rgb::colorFromNormalized([
$color->getColorValue(Imagick::COLOR_RED),
$color->getColorValue(Imagick::COLOR_GREEN),
$color->getColorValue(Imagick::COLOR_BLUE),
$color->getColorValue(Imagick::COLOR_ALPHA),
])->toColorspace(Oklab::class),
Oklch::class => Rgb::colorFromNormalized([
$color->getColorValue(Imagick::COLOR_RED),
$color->getColorValue(Imagick::COLOR_GREEN),
$color->getColorValue(Imagick::COLOR_BLUE),
$color->getColorValue(Imagick::COLOR_ALPHA),
])->toColorspace(Oklch::class),
default => throw new NotSupportedException(
'Colorspace ' . $this->colorspace::class . ' is not supported by driver',
)
};
} catch (ImagickPixelException $e) {
throw new DriverException(
'Failed to import color from ' . ImagickPixel::class,
previous: $e,
);
}
}
}