Intervention/image · error · Intervention\Image\Exceptions\InvalidArgumentException

Imagick driver can only process colors from instances of

Error message

Imagick driver can only process colors from instances of 

What it means

The Imagick driver's colorProcessor()->import() accepts exactly one input type: a native ImagickPixel. Passing anything else — a hex string, an Rgb color object, an array — raises this InvalidArgumentException immediately, before any Imagick work starts. import() is the boundary that converts engine pixels into library color objects, and the engine only speaks ImagickPixel.

Source

Thrown at src/Drivers/Imagick/ColorProcessor.php:98

                    $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),
                ]),

View on GitHub (pinned to 5598b9e397)

Solutions

  1. Wrap the value in the expected type first: new ImagickPixel('#ff0000') — its constructor accepts the same color strings you tried to pass.
  2. For user-facing color strings, use the driver's decodeColor() API instead of import().
  3. Add an instanceof ImagickPixel check before calling import() whenever the value's origin is uncertain.

Example fix

// before
$color = $image->driver()->colorProcessor($image)->import('#ff0000');

// after
$color = $image->driver()->colorProcessor($image)->import(new \ImagickPixel('#ff0000'));
Defensive patterns

Strategy: type-guard

Validate before calling

if (!$value instanceof \ImagickPixel) {
    $value = new \ImagickPixel((string) $value); // or reject the input
}
$color = $image->driver()->colorProcessor($image)->import($value);

Type guard

function isImportableImagickColor(mixed $color): bool
{
    return $color instanceof \ImagickPixel;
}

Try / catch

try { $color = $processor->import($value); } catch (\Intervention\Image\Exceptions\InvalidArgumentException $e) { /* wrap the value in new ImagickPixel() and retry */ }

Prevention

When it happens

Trigger: Calling $image->driver()->colorProcessor($image)->import('#ff0000'), ->import(new Rgb(255, 0, 0)), or ->import([255, 0, 0]) in driver-agnostic code — the same call may work under the GD driver, whose import expects a different native type, so the bug only surfaces after switching drivers.

Common situations: Shared utility code originally written and tested against GD, reused with the Imagick driver; integrating pixel values from other Imagick operations or user input.

Understand the failure class

Background: Invalid argument type errors: "must be of type string", "expected X, got Y", and ERR_INVALID_ARG_TYPE explained — this error's family across 15 libraries.

Related errors


AI-assisted analysis of Intervention/image@5598b9e397 (2026-08-23). Data as JSON: /api/errors/2a33f7aef5d93cf3. Report an issue: GitHub.