{"record":{"id":"8ecd47b94b96722f","repo":"Intervention/image","slug":"number-of-color-channels-must-be-3-or-4-for-class-8ecd47","errorCode":null,"errorMessage":"Number of color channels must be 3 or 4 for {class}","messagePattern":"Number of color channels must be 3 or 4 for (.+?)","errorType":"exception","errorClass":"Intervention\\Image\\Exceptions\\InvalidArgumentException","httpStatus":null,"severity":"error","filePath":"src/Colors/Rgb/Colorspace.php","lineNumber":49,"sourceCode":"     */\n    public static array $channels = [\n        Channels\\Red::class,\n        Channels\\Green::class,\n        Channels\\Blue::class,\n        Channels\\Alpha::class,\n    ];\n\n    /**\n     * {@inheritdoc}\n     *\n     * @see ColorspaceInterface::colorFromNormalized()\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function colorFromNormalized(array $normalized): RgbColor\n    {\n        if (!in_array(count($normalized), [3, 4])) {\n            throw new InvalidArgumentException('Number of color channels must be 3 or 4 for ' . static::class);\n        }\n\n        // add alpha value if missing\n        $normalized = count($normalized) === 3 ? array_pad($normalized, 4, 1) : $normalized;\n\n        return new Color(...array_map(\n            function (string $channel, null|float $normalized) {\n                try {\n                    return $channel::fromNormalized($normalized);\n                } catch (TypeError $e) {\n                    throw new InvalidArgumentException(\n                        'Normalized color value must be in range 0 to 1',\n                        previous: $e,\n                    );\n                }\n            },\n            self::$channels,\n            $normalized,","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/Intervention/image/blob/5598b9e39751c34afc5cdee84abef77f92c26f68/src/Colors/Rgb/Colorspace.php#L31-L67","documentation":"Rgb\\Colorspace::colorFromNormalized() builds an RGB color from an array of normalized (0..1) channel values and requires exactly 3 (r,g,b) or 4 (r,g,b,alpha) entries; a 3-entry array automatically gets alpha=1 appended. Any other count throws InvalidArgumentException naming the colorspace class.","triggerScenarios":"colorFromNormalized([0.5, 0.2]) (two values), colorFromNormalized([0.1, 0.2, 0.3, 0.5, 0.1]) (five values), or forwarding a foreign colorspace's channels() array (e.g. CMYK has 4+alpha=5 channels) to the RGB colorspace.","commonSituations":"Writing generic colorspace code that copies channel arrays between colorspaces with different channel counts; building normalized arrays in loops with an off-by-one; unpacking database or CSV payloads where a column is missing or extra.","solutions":["Pass exactly 3 or 4 normalized floats in r,g,b(,alpha) order","Build the array from an already-converted color: array_map(fn($c) => $c->normalized(), $color->toColorspace(Rgb\\Colorspace::class)->channels())","Prefer the higher-level API: $color->toColorspace(Rgb\\Colorspace::class) or Colorspace->importColor($color) instead of assembling arrays manually","In generic code, count-check the array and slice/pad to 4 before calling"],"exampleFix":"// before\n$color = \\Intervention\\Image\\Colors\\Rgb\\Colorspace::colorFromNormalized([0.5, 0.2]);\n\n// after\n$color = \\Intervention\\Image\\Colors\\Rgb\\Colorspace::colorFromNormalized([0.5, 0.2, 0.8]);","handlingStrategy":"validation","validationCode":"$values = array_map(fn($v) => (float) $v, $values);\nif (!in_array(count($values), [3, 4], true)) {\n    throw new \\InvalidArgumentException('Expected 3 or 4 normalized channel values');\n}\n$color = \\Intervention\\Image\\Colors\\Rgb\\Colorspace::colorFromNormalized($values);","typeGuard":"function isNormalizedRgbArray(array $values): bool\n{\n    return in_array(count($values), [3, 4], true)\n        && array_all($values, fn($v) => is_float($v) && $v >= 0.0 && $v <= 1.0);\n}","tryCatchPattern":"try {\n    $color = Rgb\\Colorspace::colorFromNormalized($values);\n} catch (\\Intervention\\Image\\Exceptions\\InvalidArgumentException $e) {\n    // rebuild from a safe default and log the bad payload\n    $color = Rgb\\Colorspace::colorFromNormalized([0.0, 0.0, 0.0, 1.0]);\n}","preventionTips":["Always pass 3 or 4 entries in r,g,b(,alpha) order","Do not forward channels() arrays between colorspaces with different channel counts","Prefer toColorspace()/importColor() over manually assembling normalized arrays"],"tags":["rgb","colorspace","normalized-values","php"],"backgroundTag":"argument-count-mismatch","analyzedSha":"5598b9e39751c34afc5cdee84abef77f92c26f68","analyzedAt":"2026-08-23T02:17:31.068Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}