*/ public static array $channels = [ Channels\Cyan::class, Channels\Magenta::class, Channels\Yellow::class, Channels\Key::class ]; /** * {@inheritdoc} * * @see ColorspaceInterface::createColor() */ public function colorFromNormalized(array $normalized): ColorInterface { $values = array_map(function ($classname, $value_normalized) { return (new $classname(normalized: $value_normalized))->value(); }, self::$channels, $normalized); return new Color(...$values); } /** * @param ColorInterface $color * @return ColorInterface * @throws ColorException */ public function importColor(ColorInterface $color): ColorInterface { return match ($color::class) { RgbColor::class => $this->importRgbColor($color), HsvColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)), HslColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)), default => $color, }; } /** * @param ColorInterface $color * @return Color * @throws ColorException */ protected function importRgbColor(ColorInterface $color): CmykColor { if (!($color instanceof RgbColor)) { throw new ColorException('Unabled to import color of type ' . $color::class . '.'); } $c = (255 - $color->red()->value()) / 255.0 * 100; $m = (255 - $color->green()->value()) / 255.0 * 100; $y = (255 - $color->blue()->value()) / 255.0 * 100; $k = intval(round(min([$c, $m, $y]))); $c = intval(round($c - $k)); $m = intval(round($m - $k)); $y = intval(round($y - $k)); return new CmykColor($c, $m, $y, $k); } }