HEX to HSV Converter
Convert HEX color codes to HSV (Hue, Saturation, Value) format. HSV is widely used in image editing software like Photoshop and color pickers because it aligns with how humans perceive color.
Understanding HSV
HSV represents colors using three components:
- Hue (H): The color type, 0-360° on the color wheel
- Saturation (S): Color purity, 0-100% (0 = gray, 100 = vivid)
- Value (V): Brightness, 0-100% (0 = black, 100 = full brightness)
HSV vs HSL
| Component | HSV | HSL |
|---|---|---|
| Third value | Value (brightness) | Lightness |
| White | V=100%, S=0% | L=100% |
| Full color | V=100%, S=100% | L=50% |
| Dark color | Low V | Low L |
HEX to HSV Examples
| Color | HEX | HSV |
|---|---|---|
| Red | #FF0000 | hsv(0°, 100%, 100%) |
| Dark Red | #800000 | hsv(0°, 100%, 50%) |
| Pink | #FF8080 | hsv(0°, 50%, 100%) |
| Blue | #0000FF | hsv(240°, 100%, 100%) |
When to Use HSV
- Image editing: Photoshop, GIMP color pickers
- Color selection: Intuitive brightness/saturation control
- Programmatic: Easier to create color variations
HEX and HSB / HSV
| HEX | HSB / HSV | |
|---|---|---|
| Syntax | #RRGGBB, or #RGB shorthand, or #RRGGBBAA with alpha | Not valid CSS — Photoshop, Figma and colour pickers use it internally |
| Channels | red, green, blue — each 0–255 written as two hex digits | hue 0–360°, saturation 0–100%, brightness (value) 0–100% |
| Precision | 8 bits per channel, 16.7 million colours | Continuous |
| Support | Universal. The 8-digit alpha form needs a 2020-or-later browser. | Design tools only. Convert to HEX or HSL before it reaches a stylesheet. |
| Best for | Design handoff, CSS, anywhere a colour is written as a single token. | Picking colours by eye — the square-and-hue-strip picker is HSB. |
A Worked Example
Taking CSS tomato through every format:
| Format | Value |
|---|---|
| HEX | #FF6347 |
| RGB | rgb(255, 99, 71) |
| RGBA | rgba(255, 99, 71, 0.5) |
| HSL | hsl(9, 100%, 64%) |
| HSB | hsb(9, 72%, 100%) |
| CMYK | cmyk(0%, 61%, 72%, 0%) |
Doing It in Code
``javascript
// HEX to RGB
const hexToRgb = (hex) => {
const n = parseInt(hex.replace('#', ''), 16);
return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 };
};
// RGB to HEX
const rgbToHex = (r, g, b) =>
'#' + [r, g, b].map((v) => v.toString(16).padStart(2, '0')).join('');
`
Modern CSS can do a lot of this without any conversion at all: color-mix() blends two
colours, and relative colour syntax — hsl(from var(--brand) h s calc(l + 10%)) — derives
a lighter shade without you ever computing one.
A Full Ramp From This Colour
Design systems settle on a 50–900 scale because it covers backgrounds, borders, text and
states without anyone reaching outside the palette. Mixing toward white and black rather
than adjusting HSL lightness keeps more of the hue's character:
| Step | Colour | Contrast on white | Safe for |
|---|---|---|---|
| 50 | #F5F9FF | 1.06:1 | backgrounds and fills |
| 100 | #EBF3FE | 1.12:1 | backgrounds and fills |
| 200 | #CEE0FD | 1.34:1 | backgrounds and fills |
| 300 | #B1CDFB | 1.62:1 | backgrounds and fills |
| 400 | #76A8F9 | 2.40:1 | backgrounds and fills |
| 500 | #3B82F6 | 3.68:1 | large text, borders |
| 600 | #326FD1 | 4.85:1 | body text on white |
| 700 | #295BAC | 6.59:1 | body text on white |
| 800 | #204887 | 8.98:1 | body text on white |
| 900 | #183462 | 12.31:1 | body text on white |
The contrast column is the one that decides usage. Steps below 3:1 cannot carry text at
any size and belong in fills and dividers; steps at 4.5:1 and above are safe for body copy.Adjusting It
Base colour in HSL is hsl(217, 91%, 60%). Two useful moves:
`css
/* +10% lightness, same hue */
--lighter: #6da2f8;
/* −10% lightness */
--darker: #0b64f4;
``
Raising lightness also drops perceived saturation, so a lightened colour reads greyer than its numbers suggest. Adding 5–10% saturation alongside every 20% of lightness keeps the ramp looking like one hue rather than a fade to grey.