Scandi Color Palette Extractor
Upload a photo and get a small, harmonious palette out of it — then drag one slider to pull that palette toward the muted, warm, daylight register people mean by “Scandinavian”. The extraction is real perceptual clustering, not pixel counting, and the before/after strip on every swatch shows you exactly what the grade changed, so you can decide how much of it you actually want. Everything happens on your own device; the photo is never uploaded.
The photo is decoded and sampled on your own device with a canvas — it is never uploaded, and no server ever sees it.
Drop a photo here, or choose one
Interiors, landscapes and textiles give the best palettes. Up to 20 MB.
No photo yet
Why clustering, and why in CIELAB
The quick way to build a palette extractor is to bucket every pixel by colour and return the fullest buckets. It fails in a specific and annoying way: it quantises colour space before it counts, so a wall whose shade happens to straddle a bucket boundary splits into two half-counts and loses to a small object that sits neatly inside one bucket. The palette you get back is not the palette you can see.
This runs k-means (Lloyd's algorithm with k-means++ seeding) instead, so the cluster centres settle wherever the pixels actually are rather than on a fixed grid. And it runs in CIELAB, a colour space built so that equal numerical distances look like equal differences to the eye. In plain RGB, distance is a poor proxy for “how different do these look” — two greens a long way apart in RGB can be nearly indistinguishable, while two dark colours very close in RGB are obviously different. Clustering in Lab means the groups it forms match the ones you would draw by hand.
What “Scandi-fying” actually does
The slider is not a saturation control. It applies four separate moves in CIELCh, which is CIELAB expressed as lightness, chroma (saturation) and hue angle:
- Chroma is compressed on a curve, so the loud colours come down hard while already-soft ones barely move. A flat multiplier would turn a gentle photo grey.
- Hues lean toward warm — toward a sand/ochre direction — with cool colours moving further than warm ones. That is what converts a cold blue-grey into the warm grey the aesthetic actually uses.
- Lightness is remapped into a mid band with a lift through the midtones: no crushed blacks, no blown whites, which is the airy daylight quality of the look.
- One shared warm veil is laid over every swatch equally. This is the part that matters most and is easiest to miss — cohesion comes from every colour sharing one cast, not from each being desaturated on its own.
The stats panel quantifies the result: mean chroma before and after, and the spread of chroma across the palette, which drops as the swatches converge on similar saturations. That is about as close as you can get to measuring “cohesive”. It is still a stylistic transform, though, not a measurement of your photo — drag the slider to 0% at any time to see the colours the image genuinely contains.
Häufig gestellte Fragen
Is this free, and is my photo uploaded?
Free with no signup or limit, and the photo never leaves your device. It is decoded into a canvas in your browser, sampled there, and clustered there; no server is involved at any point, and no copy is kept. That also means it works on photos you would not want to upload - unreleased product shots, interiors of a client's home, personal photos.
How does it decide which colours are in the palette?
It samples several thousand pixels spread evenly across the image, converts each into CIELAB - a colour space where numerical distance approximates perceived difference - and runs k-means clustering to find the requested number of centres. Each swatch is one cluster centre, and the percentage next to it is the share of sampled pixels that fell into that cluster. This is genuinely different from the common histogram-bucket approach: clusters land where the pixels are rather than on a fixed grid, so a colour spread across a bucket boundary is not penalised. The seeding is deterministic, so the same photo always gives you the same palette.
What makes a colour palette look Scandinavian?
Four things, and the slider does all four. Low chroma - colours are desaturated, but not toward grey, toward a soft version of themselves. A warm rather than cool neutral bias: the greys lean sand and clay, not blue. A lightness range that stays away from both pure white and pure black, which is what gives the look its diffuse, overcast-daylight quality. And, most importantly, cohesion - the whole set shares one warm cast, as if photographed in the same light, which is why a Scandinavian palette reads as deliberate rather than as five colours that happened to be in the same room.
How many colours should I ask for?
Five or six is the useful range for most work and is what interior and brand palettes typically settle on. Three or four gives you a stark palette that is easy to apply but may miss an accent the photo depends on. Seven or eight starts producing swatches that are close enough to each other that you will not use them separately - and past that, clustering begins splitting one perceptual colour into shades of itself. Start at six and drop down if two swatches look like the same colour.
What do the two strips on each swatch mean?
The narrow strip on the left is the colour as extracted from the photo, before any grading. The wide strip is the graded result you will export. Keeping both visible is deliberate: the grade is an opinion, and you should be able to see how far it moved from the source before you commit to it. The line beneath gives the same comparison numerically as the chroma before and after, alongside how much of the photo the cluster covered.
How do I get the palette into my project?
Four ways. CSS custom properties gives you a :root block with each colour under both a numbered and a named variable, ready to paste into a stylesheet. Tailwind gives you a v4 @theme block; on Tailwind 3, put the same hex values under theme.extend.colors instead. JSON gives you name, hex, the original colour and the percentage share, for feeding into anything else. And the .ase download is a real Adobe Swatch Exchange file that imports as a swatch group in Photoshop, Illustrator and InDesign. You can also click any swatch to copy just its hex.
What are the colour names - are they official?
They are labels, not standards. Each swatch is matched to the nearest entry in a fixed list of named colours by ΔE distance in CIELAB, and names are assigned so no two swatches in one palette share a name - the swatch with the most confident match claims its first choice and the rest take their nearest name still free. That makes them useful for talking and naming variables, but 'Terracotta' here means 'the nearest name in our list', not a colour standard or a paint code. Use the hex values for anything that has to be exact.
What kind of photo works best?
Images with a few broad areas of colour: interiors, landscapes, textiles, styled flat-lays, architecture. A photo dominated by one surface will give you several shades of that surface, which is technically correct and rarely what you want, so crop to include the other colours you care about. Very dark or heavily backlit shots cluster poorly because most pixels collapse toward black. Fully transparent pixels in a PNG are skipped, so a cut-out product shot returns the product's colours rather than a large swatch of nothing.