Point at any pixel. Get its exact colour.
Open a photo, screenshot or logo, then hover to magnify and click to pick. You get the colour as HEX, RGB and HSL, plus the six colours that make up most of the image. It all runs on your device; it all happens in your browser.
Camera noise and JPEG compression make neighbouring pixels differ. Averaging a small square gives the colour your eye actually sees. These are the values around the point you picked above; choose the sample size the picker should use.
Every format above describes the same picked colour. They exist because different tools think about colour differently. Each card shows your colour in that format.
Before any picker sees a pixel, the browser decodes the file, may convert it using colour information stored inside, and stores it in a canvas with its own rules. Eight tiny test images are built byte by byte below and read back by your browser, once as it would display them and once with colour conversion switched off.
IHDR + IDAT128, 128, 128128, 128, 128128, 128, 128Untagged images are assumed to be sRGB and passed through unchanged.gAMA = 100000128, 128, 128188, 188, 188128, 128, 128The gAMA chunk says the numbers are linear light, so 128 means half of white’s light, which sRGB writes as about 188. The browser re-encodes it, and a picker reports 188, not the 128 stored in the file.sRGB intent 0, then gAMA128, 128, 128128, 128, 128128, 128, 128An sRGB chunk overrides gAMA, as the PNG specification requires, so the stored value is used.gAMA = 45455128, 128, 128128, 128, 128128, 128, 128Gamma 1/2.2 is close to the sRGB curve, so the value barely moves (128).1 px columns, quality 95255, 0, 0150, 24, 150-JPEG stores colour at half resolution (4:2:0), so a one-pixel red line next to blue comes back as 150, 24, 150. Pick from an area, not a single pixel, in JPEGs.putImageData rgba(200,100,50,3)200, 100, 50 · α3170, 85, 85 · α3-Canvas stores colour premultiplied by alpha. At alpha 3 of 255 only a few levels survive, so you read back 170, 85, 85 · α 3.fillStyle color(display-p3 1 0 0)P3 (1, 0, 0)255, 0, 0-P3 red is outside sRGB, so it is clipped to plain sRGB red (255, 0, 0). A picker on an sRGB canvas can’t report wide-gamut colours.getContext("2d", { colorSpace: "display-p3" })255, 0, 0234, 51, 35-The same red, stored in a P3 canvas, reads as 234, 51, 35: identical colour, different numbers, because P3’s primaries are further out.The palette above comes from k-means clustering. Here it runs three ways on your current image: Heckbert’s median cut, k-means on RGB numbers, and k-means in OKLab, a space where equal distances look roughly equally different. Each image is redrawn with only its palette, and the error is measured per pixel in ΔE OK (×100; about 2 is a just-visible difference).
Two things decide the number a picker shows: which stage of the pipeline it reads from, and what colour information the file carries. App behaviour is from general knowledge of current versions; check their documentation before relying on it.
sRGB · gAMA · cHRM · iCCP · cICPcICP (2025) beats iCCP, then sRGB, then gAMA/cHRM. Tested live in the lab above.APP2 ICC_PROFILE (split into 64 KB markers)No profile means sRGB. Phone photos often embed Display P3.ICCP chunk in the VP8X containerOnly in the extended format; simple WebP is sRGB.colr box: nclx (CICP code points) or ICCnclx can signal BT.2020, PQ and HLG for HDR.noneAlways treated as sRGB; 256-colour palettes per frame.tag 34675 InterColorProfileCommon in print workflows with CMYK or Adobe RGB profiles.color(display-p3 …), oklch(…)Colours carry their space in the syntax itself.Tools that pick up where this one stops.