All ICC profiles share the 128-byte header with acsp at byte 36, the tag table and
typed tag data, so one reader can open them all. The version
field says which rules apply: what the reserved bytes mean, which tags and types are allowed,
and how the PCS is encoded.
Version 2 and version 4
| Version 2 (to ICC.1:2001-04) | Version 4 (ICC.1:2001-12 to ICC.1:2022) | |
|---|---|---|
| Bytes 84 to 99 | Reserved, zero | Profile ID, an MD5 digest |
| Text tags | desc, dmnd, dmdd, vued, scrd: textDescriptionType (ASCII, Unicode, ScriptCode); cprt: textType | multiLocalizedUnicodeType for all, any number of languages |
| Lookup tables | lut8Type and lut16Type only | Also lutAToBType and lutBToAType (curves, matrix with offsets, CLUT of any grid), and multiProcessElementsType for the float DToB and BToD tags |
| Tone curves | curveType | curveType or parametricCurveType |
| 16-bit PCSLAB | FF00 is L* 100 | FFFF is L* 100, except in lut16Type and namedColor2Type, which keep the old encoding |
| Perceptual black | Usually zero | Fixed at L* 3.1373 for the perceptual reference medium |
| Display white point | Often the display’s own white | The PCS illuminant (D50), with the real white adapted through chad |
| Tag data | Gaps between tags allowed | Contiguous, starting right after the tag table, padded to 4 bytes, no partial overlaps |
| Tags only in this version | crdi, devs, ncol, ps2s, ps2i, psd0 to psd3, scrd, scrn, bfd (ucrbgTag); bkpt is in version 2 and in version 4 up to 4.2 | B2D0 to B2D3, D2B0 to D2B3, ciis, clro, clrt, clot, rig0, rig2, psid, cicp (4.4) |
| Types only in this version | crdi, devs, ncol, scrn, desc (textDescriptionType), bfd | mAB, mBA, mpet, mluc, para, psid, clro, clrt, cicp (4.4) |
| Platforms | Also TGNT (Taligent) | APPL, MSFT, SGI, SUNW |
Version 2.4 (ICC.1:2001-04) already added the chromaticAdaptationTag. In version 2 the matrix tags were called redColorantTag, greenColorantTag and blueColorantTag, with the same signatures. Version 4 also lists more technology signatures (LCD, OLED and the motion-picture ones) and two more chromaticity sets (P3 and BT.2020, in 4.4). A version 4 CMM reads version 2 profiles; version 2 CMMs may not read version 4 ones, which is why both are still made.
The dictType and the metadataTag (meta) came from an ICC votable proposal,
Dictionary Type and Metadata
TAG Definition, submitted on 26 January 2010 by Ann McCarthy, Max Derhak and Lars Borg. Its
adoption added the type and the tag “to the next minor revisions of the ICC.1 specifications, both
ICC.1:2001-04 (version 2) and ICC.1:2010 (version 4)”, and its introduction proposes tags “that can
be incorporated into any ICC profile of any version”, since no CMM computes with them. The published
ICC.1:2010 text (version 4.3) does not include them: they first appear in the specification itself in
ICC.1:2022 (4.4), whose foreword lists “metadataTag and dictType have been added” among the changes
from ICC.1:2010. The explorer accepts both in version 2 and version 4 profiles of any minor
version.
iccMAX (ICC.2, version 5)
iccMAX, published as ICC.2 and as ISO 20677, extends the format for cases that a fixed D50 colorimetric PCS cannot describe: colorimetry under other illuminants and observers, spectral reflectance, transmission and emission, fluorescence (bi-spectral data), and multiplex channels whose meaning is not colour. It keeps the header, tag table and typed-data layout of ICC.1, but has its own lists of tags and types (ICC.2 clause 1: some ICC.1 types are removed and others added). An iccMAX reader is expected to read ICC.1 profiles too; an ICC.1 reader is not expected to use iccMAX ones. Its current edition is ICC.2:2023 (profile version 5.0).
Not in iccMAX’s lists: the types lut8Type, lut16Type, chromaticityType, colorantTableType,
namedColor2Type, profileSequenceDescType, profileSequenceIdentifierType, responseCurveSet16Type and
viewingConditionsType, and the tags that use them or the matrix model (rXYZ, gXYZ, bXYZ, rTRC, gTRC,
bTRC, kTRC, chad, chrm, clrt, clot, lumi, meas, ncl2, pseq, psid, resp, view, vued, gamt and the preview
tags). The explorer reports an ICC.1-only tag found in a version 5 profile as not in ICC.2’s tag
list. meas is a special case: clause 9 does not list it, but 10.2.15 extends
measurementType as “a backwards compatible extension of ISO 15076‐1 with the same tag signature”,
so the explorer only notes it (measurementType in
iccMAX).
Header
| Offset | Size | Field in iccMAX |
|---|---|---|
| 8 | 4 | Version 5.0; bytes 10 and 11 hold the profile sub-class’s major and minor version, zero without one |
| 12 | 4 | Class: also cenc ColorEncodingSpace, mid MultiplexIdentification, mlnk MultiplexLink, mvis MultiplexVisualization |
| 16 | 4 | Data colour space: also LMS , 1CLR, nc with a 16-bit count for N device channels, or zero |
| 20 | 4 | PCS: XYZ , Lab , or zero when the spectral PCS is the connection |
| 44 | 4 | Flags: also bit 2, the MCS channels must be a subset of the connected profile’s, and bit 3, the colorimetric PCS has an extended (HDR) range with Y above 1.0 |
| 56 | 8 | Attributes: also bit 4 non-paper (1), bit 5 textured (1), bit 6 non-isotropic (1), bit 7 self-luminous (1) |
| 68 | 12 | PCS illuminant: D50, or the illuminant of the spectralViewingConditionsTag |
| 100 | 4 | Spectral PCS: two letters and a 16-bit channel count, or zero |
| 104 | 6 | Spectral PCS range: start and end wavelength (float16Numbers, nm) and the number of steps (uInt16Number) |
| 110 | 6 | Bi-spectral PCS range, the same layout, for the incident light |
| 116 | 4 | MCS: mc and a 16-bit channel count, or zero |
| 120 | 4 | Profile or device sub-class, or zero |
| 124 | 4 | Reserved, zero |
| Spectral PCS | Meaning |
|---|---|
rs + count | Reflectance spectra |
ts + count | Transmission spectra |
es + count | Radiant (emission) spectra |
bs + count | Bi-spectral reflectance (a Donaldson matrix) |
sm + count | Bi-spectral reflectance as a sparse matrix |
A ColorEncodingSpace profile uses only the size, the version, the class, the data colour space
(RGB or YCbr) and acsp; its other header bytes are zero or as
in ICC.1 (Table 13 calls bytes 4 to 7, 20 to 35 and 40 to 127 reserved, while 7.2.3 allows them “set
according to ISO 15076‐1 or optionally zero filled”). Either way bytes 100 to 127, which ICC.1 does
not have, are zero. A spectral-only profile has a PCS field of zero and only DToB and BToD tags.
The header fields agree with each other (ICC.2 7.2.6 and 7.2.21 to 7.2.23):
- The channel count of an
rs,tsoresspectral PCS equals the steps of the spectral range. Forbs, the “N total channels” of a Donaldson matrix are read as the spectral range’s steps (reflected wavelengths) times the bi-spectral range’s steps (incident wavelengths). - With no spectral PCS both ranges are zero, and the bi-spectral range is zero unless the spectral
PCS is
bsorsm. - Bytes 10 and 11 of the version are zero when the sub-class field is zero.
The explorer checks all of these.
iccMAX tags and their permitted types
Every tag of ICC.2:2023 clause 9, with the types it allows there. Where a tag holds a structure or array, the identifier it must carry is given.
| Signatures | Tags | Permitted types |
|---|---|---|
A2B0 … A2B3 | AToB0Tag to AToB3Tag (3: ICC-absolute colorimetric, new) | lutAToBType or multiProcessElementsType |
B2A0 … B2A3 | BToA0Tag to BToA3Tag | lutBToAType or multiProcessElementsType |
D2B0 … D2B3, B2D0 … B2D3 | Device to PCS and back, floating point; spectral when the spectral PCS is set | multiProcessElementsType |
A2M0, M2A0 | Device to and from the multiplex connection space | multiProcessElementsType |
M2B0 … M2B3, M2S0 … M2S3 | Multiplex to colorimetric and to spectral PCS, for the four intents | multiProcessElementsType |
H2S0 … H2S3 | HdrToSdr: extended-range PCS to standard range | multiProcessElementsType |
bAB, bBA, bBD, bDB 0 to 3 | BRDF transforms | multiProcessElementsType |
bMB, bMS 0 to 3 | MCS to parameter-based BRDF, colorimetric and spectral | tagStructType, brdf |
bcp0 … bcp3, bsp0 … bsp3 | BRDF colorimetric and spectral parameters | tagStructType, brdf |
dAB, dBA, dBD, dDB 0 to 3 | Directional transforms | multiProcessElementsType |
gbd0 … gbd3 | Gamut boundary descriptions | gamutBoundaryDescriptionType |
c2sp, s2cp | Custom to standard and standard to custom profile connection conditions | multiProcessElementsType |
sPCC | Source profile connection conditions | tagStructType, pcc |
cept | Colour encoding parameters (ColorEncodingSpace profiles) | tagStructType, cept |
csnm, rfnm | Colour space name and reference name | utf8Type |
clin, clio | Colorant information, input and output | tagArrayType, cinf |
clro, cloo | Colorant order, input and output | colorantOrderType |
CxF | Colour exchange format (CxF) data | utf8Type or utf8ZipType |
targ | Characterisation target | utf8Type or utf8ZipType |
cprt | Copyright | multiLocalizedUnicodeType, textType or utf8Type |
desc, dmnd, dmdd | Profile, manufacturer and model descriptions | multiLocalizedUnicodeType |
mcta | Multiplex channel types | tagArrayType of utf8Type, mcta |
mdv | Multiplex default values | uInt8, uInt16, float16 or float32 ArrayType |
minf, miin | Measurement information and measurement input information | tagStructType, meas |
nmcl | Named colours | tagArrayType, ncol |
psin | Profile sequence information | tagArrayType, pinf |
svcn | Spectral viewing conditions | spectralViewingConditionsType |
swpt | Spectral white point | float16ArrayType, float32ArrayType or uInt16ArrayType |
smap | Surface map | embeddedNormalImageType or embeddedHeightImageType |
wtpt | Media white point | XYZType |
calt, cicp, ciis, meta, rig0, rig2, tech | As in ICC.1 | dateTimeType, cicpType, signatureType, dictType, signatureType, signatureType, signatureType |
Types iccMAX adds
| Signature | Type |
|---|---|
fl16, fl32, fl64 | float16ArrayType, float32ArrayType, float64ArrayType |
utf8, ut16 | utf8Type, utf16Type |
zut8 | utf8ZipType: UTF-8 compressed as a zlib stream |
zxml, ZXML | zipXmlType: XML compressed as a zlib stream |
tary | tagArrayType |
tstr | tagStructType |
smat | sparseMatrixArrayType |
svcn | spectralViewingConditionsType |
gbd | gamutBoundaryDescriptionType |
ehim, enim | embeddedHeightImageType, embeddedNormalImageType |
multiProcessElementsType gains the elements calc (a programmable calculator),
xclt (extended CLUT), eclt, emtx, eobs and
iemx (emission), rclt and robs (reflectance),
smet (sparse matrix), tint (tint array), tmap (tone map), and
JtoX and XtoJ (colour appearance), and its curve sets gain single-sampled
and calculator-sampled curves. All of them, and the structures and arrays, are described byte by
byte on iccMAX types and elements, and the explorer decodes
them all.