• JSON output is designed to plug directly into your colour pipeline or research tools.
• CSV output exports the raw tag table — import into Excel/Sheets for custom analysis.
• Multi-profile comparison is available in the Research tab — drop multiple profiles sequentially.
• TRC data — for table-based TRC (e.g. 1024 entries), only gamma approximation is shown in the UI; full data is in JSON.
ICC Specification (ICC.1:2022)
ICC.1:2022 defines the architecture, profile format, and data structures for ICC color management. The specification mandates the Profile Connection Space (PCS) under D50 illuminant using CIEXYZ or CIELAB encoding.
Profile classes: Input (scnr), Display (mntr), Output (prtr), DeviceLink (link), ColorSpace (spac), Abstract (abst), NamedColor (nmcl). Display profiles (mntr) are most common for monitors.
Tag table: Each profile contains a tag table with signature, offset, and size entries pointing to typed data elements (XYZType, curveType, parametricCurveType, textType, multiLocalizedUnicodeType, etc.).
The Bradford CAT is mandated for chromatic adaptation between device white point and D50 PCS. No alternative transforms are permitted.
ICC v2 vs v4 Differences
Version 2 (ICC.1:2001-04): Uses 'desc' tag type for profile description. Simpler header. Widely supported by legacy software.
Version 4 (ICC.1:2004+): Introduces 'mluc' (multiLocalizedUnicodeType) for localised descriptions. Adds profile ID (MD5 checksum) in header bytes 84-99. Requires D50 PCS. Mandates Bradford CAT. Tighter validation rules.
Key parsing differences: v2 'desc' → ASCII string at offset+12. v4 'mluc' → UTF-16BE at computed offset. Both use same XYZType, curveType, parametricCurveType structures. Header layout identical through byte 127; tag table starts at 128.
Rendering Intents
- Perceptual (0): Compresses entire source gamut into destination gamut. Preserves relative relationships. Used for photographic images.
- Relative colorimetric (1): Clips out-of-gamut colours to nearest in-gamut point. Adapts white point. Used for proofing and logos.
- Saturation (2): Maximises saturation. Used for business graphics (charts, diagrams).
- Absolute colorimetric (3): Like relative colorimetric but preserves absolute white point. Used for spot colour matching.
Tone Response Curves (TRC)
curveType ('curv'): If count=0 → identity (γ=1.0). If count=1 → simple gamma (u8Fixed8Number). If count>1 → lookup table of uint16 values normalised to [0,1].
parametricCurveType ('para'): Defines gamma via parametric functions (types 0-4). Type 0: Y = X^γ. Type 3 (sRGB-like): Y = (aX+b)^γ + c for X≥d, else Y = eX+f.
sRGB reference: γ ≈ 2.2 (exact: piecewise function with linear segment below 0.04045). Adobe RGB: γ = 2.199. DCI-P3: γ = 2.6.
CIE 1931 Standard Observer & Chromaticity
The CIE 1931 2° standard observer defines colour matching functions x̄(λ), ȳ(λ), z̄(λ) from 360-830 nm. These are the basis for all tristimulus colorimetry (XYZ).
Chromaticity coordinates: x = X/(X+Y+Z), y = Y/(X+Y+Z). The spectral locus is the horseshoe-shaped boundary of all monochromatic colours. The line of purples connects the 380 nm and 780 nm endpoints.
Gamut triangles plotted on the chromaticity diagram show the range of colours reproducible by a three-primary system. Larger triangle = wider gamut.
Standard Illuminants & PCS
- D50 (5003 K): ICC Profile Connection Space reference. Printing industry standard.
- D65 (6504 K): sRGB, Rec. 709, Rec. 2020 reference white. Standard daylight.
- D55 (5503 K): Mid-daylight. Some photographic standards.
- D75 (7504 K): North sky daylight.
- A (2856 K): Tungsten/incandescent. Planckian radiator.
ICC profiles store the device white point in the header (bytes 68-79) as s15Fixed16Number XYZ values. The parser matches this against known illuminants by xy distance.
Known Gamut Standards
- sRGB (IEC 61966-2-1): R(0.64,0.33) G(0.30,0.60) B(0.15,0.06). D65 white. ~35% of visible gamut.
- Display P3 (DCI-P3 adapted): R(0.68,0.32) G(0.265,0.69) B(0.15,0.06). D65 white. ~26% larger than sRGB.
- Adobe RGB (1998): R(0.64,0.33) G(0.21,0.71) B(0.15,0.06). D65 white. ~35% larger than sRGB.
- ProPhoto RGB (ROMM): R(0.7347,0.2653) G(0.1596,0.8404) B(0.0366,0.0001). D50 white. ~87% of visible gamut.
- Rec. 2020 (ITU-R BT.2020): R(0.708,0.292) G(0.170,0.797) B(0.131,0.046). D65 white. ~76% of visible gamut.
ICC Profile Binary Layout:
Bytes 0-3: Profile size (uint32 big-endian)
Bytes 4-7: CMM type signature (4-char ASCII)
Bytes 8-11: Version (major.minor.bugfix packed)
Bytes 12-15: Device class signature (scnr/mntr/prtr/link/spac/abst/nmcl)
Bytes 16-19: Color space signature (RGB/CMYK/GRAY/Lab/XYZ...)
Bytes 20-23: PCS signature (XYZ/Lab)
Bytes 24-35: Date/time (6 × uint16: Y/M/D/H/M/S)
Bytes 36-39: Magic number ('acsp' = 0x61637370)
Bytes 40-43: Platform signature (APPL/MSFT/SGI/SUNW)
Bytes 44-47: Profile flags (uint32)
Bytes 48-51: Device manufacturer (4-char)
Bytes 52-55: Device model (4-char)
Bytes 64-67: Rendering intent (uint32: 0/1/2/3)
Bytes 68-79: PCS illuminant XYZ (3 × s15Fixed16Number)
Bytes 80-83: Profile creator (4-char)
Tag table (starts at byte 128):
Byte 128-131: Tag count (uint32)
Each tag entry: 12 bytes (4-char sig + uint32 offset + uint32 size)
Tone Response Curve Decoding:
Header: 4-byte type sig + 4 reserved + uint32 count
count=0: Identity TRC (γ=1.0)
count=1: Simple gamma — u8Fixed8Number (uint16/256)
count>1: Lookup table — uint16[count] normalised to [0,65535]
parametricCurveType ('para'):
Header: 4-byte type + 2 reserved + uint16 funcType
Type 0: Y = X^γ (1 param)
Type 1: Y = (aX+b)^γ X>=-b/a (3 params)
Y = 0 X < -b/a
Type 2: Y = (aX+b)^γ + c X>=-b/a (4 params)
Y = c X < -b/a
Type 3: Y = (aX+b)^γ X>=d (5 params: sRGB-like)
Y = cX X < d
Type 4: Y = (aX+b)^γ + e X>=d (7 params)
Y = cX+f X < d
Parameters stored as s15Fixed16Number (int32/65536)
sRGB ↔ XYZ (IEC 61966-2-1, D65):
if C_srgb ≤ 0.04045: C_lin = C_srgb / 12.92
else: C_lin = ((C_srgb + 0.055) / 1.055)^2.4
Linear RGB → XYZ (D65):
|X| |0.4124564 0.3575761 0.1804375| |R_lin|
|Y| = |0.2126729 0.7151522 0.0721750| |G_lin|
|Z| |0.0193339 0.1191920 0.9503041| |B_lin|
XYZ → Linear RGB (D65):
|R_lin| | 3.2404542 -1.5371385 -0.4985314| |X|
|G_lin| = |-0.9692660 1.8760108 0.0415560| |Y|
|B_lin| | 0.0556434 -0.2040259 1.0572252| |Z|
sRGB Forward Companding (to encoded):
if C_lin ≤ 0.0031308: C_srgb = 12.92 × C_lin
else: C_srgb = 1.055 × C_lin^(1/2.4) − 0.055
Computing RGB↔XYZ matrices from ICC primaries:
Step 1: Convert xy → XYZ (assuming Y=1):
Xi = xi / yi, Yi = 1, Zi = (1−xi−yi) / yi
Step 2: Build 3×3 matrix M from primary XYZ columns:
M = | Xr Xg Xb |
| Yr Yg Yb |
| Zr Zg Zb |
Step 3: Compute scale factors S = M⁻¹ × W (white point XYZ):
[Sr, Sg, Sb]ᵀ = M⁻¹ × [Xw, Yw, Zw]ᵀ
Step 4: Final RGB→XYZ matrix:
M_toXYZ = M × diag(Sr, Sg, Sb)
Step 5: XYZ→RGB = inverse of M_toXYZ
Diagnostics:
det(M) — should be near 1.0 (preserves volume)
κ(M) = ‖M‖_F × ‖M⁻¹‖_F — condition number (lower = stable)
‖M‖_F = √(Σ mij²) — Frobenius norm
Gamut Classification Algorithm:
dr = dist(profile.R, G.R) — Euclidean xy distance
dg = dist(profile.G, G.G)
db = dist(profile.B, G.B)
dw = dist(profile.WP, G.WP)
score = dr + dg + db + 2×dw
Best match = gamut with lowest score
Confidence levels:
score < 0.02 → High (almost exact match)
score < 0.05 → Medium (close but not exact)
score ≥ 0.05 → Low (significantly different)
Gamut area (Shoelace formula):
A = ½ |Rx(Gy−By) + Gx(By−Ry) + Bx(Ry−Gy)|
Relative coverage = A / A_sRGB × 100%
CIELAB & CIEDE2000:
f(t) = t^(1/3) if t > (6/29)³ = 0.008856
f(t) = (29/6)²×t/3 + 4/29 otherwise
L* = 116 × f(Y/Yn) − 16
a* = 500 × [f(X/Xn) − f(Y/Yn)]
b* = 200 × [f(Y/Yn) − f(Z/Zn)]
CIEDE2000 (dE00) — full formula with rotation term:
G = 0.5 × [1 − √(C̄⁷/(C̄⁷+25⁷))]
a'ᵢ = aᵢ(1+G), C'ᵢ = √(a'ᵢ²+bᵢ²), h'ᵢ = atan2(bᵢ,a'ᵢ)
SL = 1 + 0.015(L̄'−50)²/√(20+(L̄'−50)²)
SC = 1 + 0.045C̄', SH = 1 + 0.015C̄'T
T = 1 − 0.17cos(h̄'−30°) + 0.24cos(2h̄')
+ 0.32cos(3h̄'+6°) − 0.20cos(4h̄'−63°)
RT = −sin(2Δθ) × RC (rotation in blue region)
dE00 = √[(ΔL'/SL)² + (ΔC'/SC)² + (ΔH'/SH)² + RT·(ΔC'/SC)(ΔH'/SH)]
- Binary parsing: Only common tag types are decoded (text, desc, mluc, XYZ, curv, para). Proprietary tag types (e.g. Apple 'vcgt', Adobe private tags) are listed but not decoded.
- Gamut classification: Compares xy primaries only. Profiles with unusual white points or non-standard primaries may show Low confidence.
- TRC approximation: Table-based TRCs (e.g. 1024 entries) are plotted from raw data. Gamma estimate is only shown for simple gamma or parametric type 0.
- CMYK/Lab profiles: Only RGB profiles get primaries, TRC, gamut, and matrix analysis. CMYK, Lab, Gray, and multi-channel profiles show header + tag table only.
- Display dependent: Chromaticity diagrams and colour swatches depend on monitor calibration. Use ICC-profiled displays.
- No network: All parsing is client-side. Files never leave the browser.
ICC Specification
[2] ICC (2010). ICC.1:2010 — Profile version 4.3 (identical to ISO 15076-1:2010).
[3] ICC (2001). ICC.1:2001-04 — Profile version 2.4. Legacy specification for v2 profiles.
Colorimetry and CIE Standards
[5] CIE (1931). Commission Internationale de l'Éclairage Proceedings, 1931 Cambridge.
[6] Sharma, G., Wu, W., Dalal, E.N. (2005). The CIEDE2000 color-difference formula. Color Res. App., 30(1), 21-30. DOI: 10.1002/col.20070
Color Spaces and Gamut
[8] Adobe Systems (2005). Adobe RGB (1998) Color Image Encoding. Version 2005-05.
[9] Apple Inc. Display P3 — DCI-P3 primaries with D65 white point adaptation.
[10] ITU-R BT.2020 (2015). Parameter values for ultra-high definition television systems.
[11] ROMM RGB (ProPhoto RGB). Eastman Kodak, ISO 22028-2:2013.
Matrix and Chromatic Adaptation
[13] Fairchild, M.D. (2013). Color Appearance Models, 3rd Ed. Wiley-Blackwell. ISBN: 978-1-119-96703-3
[14] Lindbloom, B. (2017). Chromatic Adaptation. brucelindbloom.com.
ICC Profile Analysis Research
[16] Bala, R. (2003). Device characterization. Digital Color Imaging Handbook, CRC Press. Ch. 5.
[17] Green, P. (2010). Color Management: Understanding and Using ICC Profiles. Wiley.
About this tool
This tool parses ICC v2/v4 binary profiles entirely on-device with zero network calls. It decodes headers, tag tables, TRC curves, primaries, white points, gamut classification, RGB↔XYZ matrix computation, CIE 1931 chromaticity plots, and multi-profile comparison. Not a substitute for official ICC profile validators or commercial colour management systems.
Drop multiple ICC profiles sequentially (on the Lab tab), then click Compare to overlay all profile gamut triangles on a single CIE 1931 chromaticity diagram. Shows version, gamut, TRC, white point side-by-side.
| # | Name | Version | Space | Gamut | TRC | White Point | Tags |
|---|---|---|---|---|---|---|---|
| Load 2+ profiles, then click Compare | |||||||
Enter hex colours (one per line or comma-separated). Computes XYZ, CIELAB (D50), and relative luminance for each colour using the current profile's white point as context.
Research note: ICC profiles can be fingerprinted by their unique combination of primaries, TRC type, tag ordering, and metadata strings. Two profiles from the same software/hardware pipeline typically share identical tag signatures and CMM types.
• APPL (Apple ColorSync), ADBE (Adobe CMM), MSFT (Microsoft ICM)
• Lcms (Little CMS), argl (ArgyllCMS), HDM (Heidelberg)
Common platform signatures:
• APPL (macOS), MSFT (Windows), *nix (Linux/X11)
TRC fingerprints:
• γ=2.200 → sRGB-like (most display profiles)
• γ=2.199 → Adobe RGB (1998)
• γ=1.800 → Apple legacy (pre-Snow Leopard)
• γ=2.600 → DCI-P3 cinema
• Table(1024+) → hardware-calibrated (i1Display, Spyder, etc.)