SixLabors/ImageSharp · error · NotImplementedException

Multi process elements are not supported

Error message

Multi process elements are not supported

What it means

InitD validates the profile's D2B/B2D multi-process-elements entry but then unconditionally throws NotImplementedException because multi-process element processing is not implemented in ImageSharp's ICC converter. This is a deliberate feature gap, not a profile validity issue.

Solutions

  1. Replace the profile with a v2/v4 LUT-based (A2B/lut16/lutAtoB) or matrix/TRC profile that ImageSharp supports.
  2. Convert the profile externally with littleCMS/iccMAX tooling to a legacy encoding.
  3. Catch NotImplementedException at converter creation and fall back to another color-management implementation.

Example fix

// before: v5 iccMAX profile -> NotImplementedException
var converter = new IccConverter(iccMaxProfile);
// after: pre-convert the profile to a supported v4 encoding
// $ iccFromXml / lcms transicc to emit lutAtoB D2B-free profile
var converter = new IccConverter(convertedV4Profile);
Defensive patterns

Strategy: try-catch

Validate before calling

if (profile.Tags.TryGetValue(IccProfileTag.D2B0, out var e)
    && e is IccMultiProcessElementsTagDataEntry)
{
    throw new NotSupportedException("Choose a v4 LUT-based profile instead.");
}

Type guard

static bool UsesMultiProcessElements(IccProfile p) =>
    p.Tags.TryGetValue(IccProfileTag.D2B0, out var e) && e is IccMultiProcessElementsTagDataEntry;

Try / catch

try { converter = new IccConverter(profile); }
catch (NotImplementedException) { converter = new IccConverter(ConvertToV4LutProfile(profile)); }

Prevention

When it happens

Trigger: Any converter initialization that routes through InitD — i.e. an ICC profile whose D2B/B2D tags are present and typed as IccMultiProcessElementsTagDataEntry (typical of ICC v5 / extended color profiles, e.g. spectral or HDR profiles).

Common situations: Processing ICC v5 (iccMAX) or high-dynamic-range profiles; device profiles exported by tools that emit MPE-based D2B transforms.

Related errors


AI-assisted analysis of SixLabors/ImageSharp@59ce6af6fc (2026-09-13). Data as JSON: /api/errors/e3a4d056b987340d. Report an issue: GitHub.

Appendix: source

Thrown at src/ImageSharp/ColorProfiles/Icc/IccConverterbase.Conversions.cs:71

            _ => throw new InvalidIccProfileException("Invalid conversion method."),
        };

    private static IVector4Calculator InitA(IccProfile profile, IccProfileTag tag)
        => GetTag(profile, tag) switch
        {
            IccLut8TagDataEntry lut8 => new LutEntryCalculator(lut8),
            IccLut16TagDataEntry lut16 => new LutEntryCalculator(lut16),
            IccLutAToBTagDataEntry lutAtoB => new LutABCalculator(lutAtoB),
            IccLutBToATagDataEntry lutBtoA => new LutABCalculator(lutBtoA),
            _ => throw new InvalidIccProfileException($"Invalid entry {tag}."),
        };

    private static IVector4Calculator InitD(IccProfile profile, IccProfileTag tag)
    {
        IccMultiProcessElementsTagDataEntry entry = GetTag<IccMultiProcessElementsTagDataEntry>(profile, tag)
            ?? throw new InvalidIccProfileException("Entry is null.");

        throw new NotImplementedException("Multi process elements are not supported");
    }

    private static ColorTrcCalculator InitColorTrc(IccProfile profile, bool toPcs)
    {
        IccXyzTagDataEntry redMatrixColumn = GetTag<IccXyzTagDataEntry>(profile, IccProfileTag.RedMatrixColumn);
        IccXyzTagDataEntry greenMatrixColumn = GetTag<IccXyzTagDataEntry>(profile, IccProfileTag.GreenMatrixColumn);
        IccXyzTagDataEntry blueMatrixColumn = GetTag<IccXyzTagDataEntry>(profile, IccProfileTag.BlueMatrixColumn);

        IccTagDataEntry redTrc = GetTag(profile, IccProfileTag.RedTrc);
        IccTagDataEntry greenTrc = GetTag(profile, IccProfileTag.GreenTrc);
        IccTagDataEntry blueTrc = GetTag(profile, IccProfileTag.BlueTrc);

        if (redMatrixColumn == null ||
            greenMatrixColumn == null ||
            blueMatrixColumn == null ||
            redTrc == null ||
            greenTrc == null ||
            blueTrc == null)

View on GitHub (pinned to 59ce6af6fc)