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
- Replace the profile with a v2/v4 LUT-based (A2B/lut16/lutAtoB) or matrix/TRC profile that ImageSharp supports.
- Convert the profile externally with littleCMS/iccMAX tooling to a legacy encoding.
- 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
- Avoid iccMAX/v5 profiles until MPE support lands; pre-convert them with lcms/iccMAX tools.
- Keep a conversion step in your asset pipeline that normalizes profiles to v2/v4.
- Feature-detect at startup by attempting converter construction on your profile set.
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
- Entry is null.
- Invalid entry .
- Missing matrix column or channel.
- Invalid parametric curve type of
- Invalid curve segment type of
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)