DYELOT / OVERVIEW
Local · nothing uploaded
Contact

Overview

no image loaded

Whole-frame measurement in CIELAB. Every figure below is computed from the working-resolution buffer, so it reflects what the rendered file actually contains — not what the preview looks like on this display.

What colour is that, exactly?

Drop in a photograph and DYELOT reads it back to you: the values under any point you click, the palette the frame is really built from, and how its shadows, midtones, and highlights are toned. Camera raw included — no upload, no account.

Drop a photograph anywhere
or or
JPEGPNGWebPAVIF CR3 · CR2NEFARWRAF DNG3FRORFRW2+15 more
Point and region

Identify a colour

Click anywhere. Average across 1 to 625 pixels so you read the jacket, not the sensor noise. Hex, RGB, HSL, Lab, LCh, nearest named colour, and the ΔE00 distance between any two samples — the number that says whether two colours are actually different or just look it.

k-means in CIELAB

Pull the palette

Swatches clustered the way the eye separates colour, not the way RGB does. Hover one and every pixel it came from lights up in the frame. Export as hex, CSS variables, JSON, CSV, a GIMP palette, or a labelled PNG strip.

Split-tone and scopes

Read the grade

Shadows, midtones, and highlights averaged separately and reported on the same two axes your white balance moves. Waveform, RGB parade, histogram, and a vectorscope with the skin-tone line at 123°. Load a second frame to match one grade to another.

Free, no account, no ads, nothing uploaded. Every file is decoded and measured in this browser tab — including camera raw, which browsers cannot normally open at all. The page makes no requests to any other origin, and once it has loaded it keeps working with the network off. 16-bit TIFF and PSD need a small optional companion.
Something look wrong? A misread colour or a camera it will not open is the most useful thing you can send.
Contact us

Inspect

click to sample · drag to marquee · wheel to zoom · space-drag to pan
Tool
Aperture

Reading

no sample
Name
sRGB
Linear
HSL
Lab
LCh
Temp axis
As neutral
Vector

Pinned

ΔE00 between last two: —
Pin two or more samples to compare them. Distances are CIEDE2000.

Palette

k-means clustering in CIELAB

Clustering runs on perceptual coordinates rather than RGB, so swatches separate by how the eye reads them. Raise the chroma weight when a frame keeps returning six shades of the same grey.

Swatches
6
Chroma weight
1.0×

Scopes

Rec.709 luma · 8-bit code values

Broadcast-style instruments computed from the encoded signal, which is what the eye and the grading panel both respond to. The vectorscope graticule carries 75% bar targets and the skin-tone line at 123°.

Waveform

luma · column position

Vectorscope

Cb / Cr

RGB parade

R · G · B

Histogram

channel counts

Tonal grade

split-tone decomposition

The frame is split by L* into three zones and each is averaged as a vector, so opposing casts cancel instead of piling up. In Lab, b* is the temperature axis (positive = yellow) and a* is the tint axis (positive = magenta) — the same two axes your white balance controls move.

Shadow / midtone break — L*
33
Midtone / highlight break — L*
66

Dial-in sheet

suggested moves

Skin-tone check

sample a face, then read here
Pin a sample from a lit cheek or forehead in Inspect. DYELOT compares its vectorscope angle to the 123° skin line and reports the rotation needed to land on it.

Match

source vs reference

Load a reference frame whose grade you want to land on. DYELOT compares the two zone-by-zone and states the move in Lab units — positive Δb* means the source needs warming to match.

No reference loaded

Use Load reference in the command bar to bring in the frame you are grading toward.

Export

everything stays on this machine

Method

what the numbers mean

Color pipeline

Pixels are read as sRGB, linearised with the piecewise IEC 61966-2-1 transfer function, converted to CIE XYZ under a D65 white point, then to CIELAB. Averaging happens in linear light, which is why a 25×25 aperture over a noisy shadow gives a usable answer instead of a value biased bright by gamma.
Aperture
A single pixel is a measurement of sensor noise as much as of subject color. For identifying a garment, a paint chip, or a skin tone, 5×5 or 11×11 is the honest reading.
Bit depth
A browser canvas is 8-bit, so a JPEG loaded here gives roughly 13 distinct code values across the darkest stop. With the sidecar running, raw and 16-bit TIFF arrive as a 16-bit buffer and the same stop carries several thousand. Shadow colour identification is the measurement that changes most.
Untagged profiles
On the browser path the pixels arrive already converted to the display path. A file tagged Adobe RGB or Display P3 reads correctly in current Chrome and Safari; an untagged wide-gamut export reads as sRGB and the saturated values will be wrong. Tag your exports. On the sidecar path this cannot happen — the working space is stated explicitly and its primaries are used for every conversion.

What this sends

Nothing. There is no account, no upload, no analytics, and no advertising. The page makes no requests to any other origin — the typefaces are served from here or fall back to the ones already on your machine, so no font CDN sees your visit either.
It works offline
After the first visit the tool is cached and runs with the network off. You can install it from the browser menu and it behaves like a normal application.
Free
No paid tier, no feature held back. If it saved you an afternoon and you want to send a coffee, there is a link in the sidebar; if not, that is completely fine and nothing changes.
Getting in touch
If a measurement looks wrong, or a raw file will not open, say so — that is the most useful thing anyone can send. Contact.
No warranty
Measurements are only as good as the file you feed in. For work where the numbers carry consequences, verify against a calibrated target rather than trusting any single tool.

Raw sidecar

python dyelot_server.py starts a loopback-only decoder built on LibRaw. Files are read from memory, never written to disk, and never leave the machine.
Auto-brightness is off
LibRaw would otherwise rescale each frame to a pleasing exposure, which silently destroys any comparison between two files. Every decode here is at the raw's own scaling.
Demosaic is skipped when it can be
When the output is being reduced by 2× or more anyway, each 2×2 CFA block is read directly instead of being interpolated and then averaged away. Fewer invented colours near edges.
Clipping is counted first
Blown and crushed pixels are counted at full decode resolution, before any downsampling can average them into something that looks recoverable.
White balance is a control, not a given
As shot, daylight, auto, and none. "None" applies unity multipliers and shows the sensor's own balance, which is where a colour cast that survives every edit usually turns out to live.

Instruments

ΔE00 — CIEDE2000 difference. Under 1.0 is invisible to most viewers, 1–2 is visible on a side-by-side edge, above 5 reads as a different color.
Skin line
Human skin across every complexion clusters near 123° in the Cb/Cr plane; melanin changes the distance from centre, not the angle. A face sitting off that line is a white-balance problem, not a skin problem.
Correlated color temperature
The CCT shown for a sample is McCamy's approximation with Ohno's Duv, applied to the pixel as rendered. It answers "what illuminant would produce this patch if the patch were neutral" — useful when you click a grey card, meaningless when you click a red jacket.
Zone averaging
Each tonal zone is averaged as a vector in a*/b*, so a frame with green shadows on one side and magenta on the other reports near zero rather than a false cast. Mean absolute chroma is reported alongside to catch that case.

Release to load

Nothing is uploaded