Extract embedded ICC profiles
Recover exact ICC bytes from local JPEG, static PNG or ICC files and read every declared localized description without recoloring images.
- 1Add input
- 2Review and run
- 3Get your result
Tool input and files are processed in this browser without being uploaded.
Before you start
Select local JPEG, static PNG and ICC/ICM originals. Recover their exact embedded or supplied color profiles, complete header/tag inventory and every declared text record. Download a ZIP containing reusable profile bytes, full JSON and formula-protected CSV.
How to use this tool
- Select original JPEG, static PNG or ICC/ICM files; retain their originals.
- Review profile/no-profile status, declared descriptions, raw version and color-space fields.
- Download the complete ZIP and compare each exported profile SHA256 with the report.
- Use a suitable color management system separately when you need rendering or transform validation.
Supported inputs and limits
1–100 original files; each at most 20 MiB and combined at most 80 MiB. Original names at most 512 UTF-16 units. The entire batch either completes or refuses; every original SHA256 is retained.
Each profile at most 8 MiB and combined profile bytes at most 32 MiB. At most 4,096 tags per profile, 65,536 total tags, 1,024 records per MLUC tag, 10,000 text records and 4,194,304 text UTF-16/ASCII units. Container marker/chunk visits at most 100,000. These work budgets apply together.
Static PNG checks the full chunk chain and every CRC, required ordering, supported IHDR, iCCP keyword and bounded zlib profile. APNG and unknown critical chunks refuse. JPEG checks marker and scan framing through EOI and reconstructs every complete numbered ICC_PROFILE APP2 piece in declared order, even when physical order differs. No pixel or entropy decoding is claimed.
ICC major versions 2 and 4: exact word-aligned declared size, all header fields, tag spans, zero reserved bytes and full raw export. Exact shared tag spans and shared MLUC string spans are accepted; partial tag overlap is outside this profile. MLUC UTF-16BE, legacy desc and classic text are read strictly. A leading U+FEFF in declared text remains literal.
All unknown or nontext tag contents remain recoverable via the exported complete profile and exact offset/size/SHA256 references. Legacy ScriptCode bytes remain opaque. No guessed sRGB, EXIF ColorSpace fallback or missing-name invention. A valid image with no profile is reported explicitly.
Full JSON plus every safe CSV row at most 32 MiB. ZIP at most 65 MiB; that allocation guard is implied by the 32 MiB profile and report bounds, not an independently reachable output ceiling. Profile sizes are word-aligned: byte guards reject +1 before structure, while the first otherwise valid aligned excess is +4.
Table shows all selected sources with cells capped at 2,000 UTF-16 units; complete localized strings and raw unknown tags are in the ZIP. No color rendering, calibration, transform usability or ICC conformance certification. PNG cICP may override ICC during rendering. LittleCMS 2.19 refuses directories above its 100-tag internal limit; this inventory can still preserve them, without claiming CMM compatibility.
TIFF/PDF/WebP/HEIF/JXL, network/installed-profile lookup, code/CSS execution and automatic navigation are outside this release. Original metadata is preserved; this is not anonymization.
Worked example
Example input
Seven small originals: profiled PNG, progressive JPEG, legacy ICC, cICP+ICC PNG, two untagged images and an opaque-tag ICC.
Example options
{}Example output
7 sources / 2,999 bytes → 5 profiles / 1,880 bytes; 28 tags, 8 text records, 114 text units; complete ZIP 27,960 bytes.
When something does not work
Correct the named encoding, missing JPEG profile piece, bad CRC, unsupported structure or simultaneous budget issue and rerun the original batch. Refusal/cancellation creates no partial exports; a fresh Worker can process the same selected bytes.
Frequently asked questions
Is a PNG profile keyword the real profile name?
No. The PNG keyword is recorded separately. Declared names come from complete ICC desc/text/MLUC records; no EXIF or built-in sRGB name is guessed.
Does an embedded profile prove rendered colors or calibration?
No. This extracts declared bytes and metadata. It does not decode pixels or apply a transform. Other color hints, including PNG cICP, may control a renderer instead.
Why can the report preserve a profile LittleCMS refuses?
LittleCMS 2.19 has an internal 100-tag directory ceiling. This bounded inventory supports up to 4,096 tags per profile and preserves all original bytes, without promising that a color management system can use them.