Chuyển RGB sang HSL

Gõ hoặc dán giá trị RGB, hay rgb(255, 99, 71), để lấy ngay giá trị hsl() tương ứng, kèm luôn màu đó ở dạng hex, HSV và CMYK nếu bạn cần.

File không bao giờ rời khỏi thiết bị của bạn
hslhsl(9, 100%, 64%)
hex#ff6347
rgbrgb(255, 99, 71)
hsvhsv(9, 72%, 100%)
cmykcmyk(0%, 61%, 72%, 0%)

Bắt đầu từ RGB thay vì hex

RGB thường là nơi một màu xuất hiện trong code — một API canvas, thanh trượt kênh của color picker, dữ liệu pixel của một ảnh — nên đổi thẳng RGB sang HSL, không qua chuỗi hex ở giữa, là đường đi phổ biến hơn trong thực tế. Phép tính vẫn y hệt, chỉ định dạng đầu vào là khác.

Tính tay với rgb(142, 68, 173)

Lấy ba kênh: 142 (đỏ), 68 (xanh lá), 173 (xanh dương). Lớn nhất là xanh dương với 173, nhỏ nhất là xanh lá với 68. Độ sáng là trung bình cộng: (173 + 68) / 2 = 120,5, tính theo tỷ lệ của 255 là khoảng 47% — số l trong hsl(282, 44%, 47%).

Độ bão hòa so sánh khoảng cách giữa kênh lớn nhất và nhỏ nhất (173 − 68 = 105) với việc độ sáng đó cách giữa dải màu bao xa; tính ra khoảng 44%, một màu bão hòa vừa phải chứ không rực. Tông màu nhìn vào xanh dương là kênh lớn nhất, rồi xem đỏ và xanh lá nằm ở đâu so với khoảng cách 105 đó, ra 282 độ — nằm hẳn trong vùng tím, giữa xanh dương (240°) và hồng cánh sen (300°).

Mẹo: Kênh nào lớn nhất sẽ cho biết ngay tông màu rơi vào phần ba nào của bánh xe, trước cả khi tính xong: đỏ lớn nhất thì tông màu gần 0°, xanh lá lớn nhất thì gần 120°, xanh dương lớn nhất thì gần 240°.

Một ví dụ tối: rgb(0, 31, 63)

Các kênh đều nhỏ không cần xử lý riêng — vẫn theo đúng các bước trên. Kênh lớn nhất là xanh dương (63), nhỏ nhất là đỏ (0), nên độ sáng là (63 + 0) / 2 = 31,5, khoảng 12% của 255. Độ sáng thấp đó là lý do màu đọc như một xanh navy gần đen chứ không phải xanh dương trung bình, dù độ bão hòa vẫn ra đúng 100% — bão hòa hoàn toàn chỉ có nghĩa là không pha xám, chứ không nói gì về việc màu đó sáng hay tối.

Mẹo: Một màu có thể bão hòa 100% mà vẫn trông gần như đen. Nếu một màu "bão hòa hoàn toàn" trong bảng màu của bạn nhìn xỉn, hãy kiểm tra độ sáng trước khi nghĩ do độ bão hòa — số l thấp thường mới là nguyên nhân thật.

Khi hai kênh cùng bằng nhau ở mức cao nhất

rgb(0, 200, 200) có xanh lá và xanh dương cùng bằng 200, cả hai đều cao hơn đỏ ở 0, đặt màu đó đúng ngay ranh giới giữa phần ba xanh lá và xanh dương của bánh xe: hsl(180, 100%, 39%), một màu lục lam. rgb(200, 0, 200), đỏ và xanh dương cùng bằng nhau và cao hơn xanh lá, ra hsl(300, 100%, 39%), một màu hồng cánh sen. Không trường hợp nào cần xử lý đặc biệt — cùng quy tắc "kênh lớn nhất" chọn ra 180 và 300 mà không cần lấy trung bình, vì một cặp bằng nhau ở mức cao nhất vẫn để lại một kênh rõ ràng ở mức thấp nhất, đủ để công thức xác định tông màu chính xác.

Chỉnh một màu: RGB so với HSL

Việc cần làmBằng RGBBằng HSL
Làm sáng hơn 20%Tính lại cả ba kênh tiến về 255Cộng thêm khoảng 20 vào số l
Làm bớt rựcTrộn cả ba kênh về giá trị trung bìnhGiảm số s
Chọn một màu liên quanKhông có cách trực tiếpCộng hoặc trừ độ vào h
Lưu chính xácBa số nguyên, 0–255 mỗi sốBa số trên ba thang khác nhau

RGB gọn và chính xác, đó là lý do các định dạng file và header lưu màu theo cách đó. HSL đánh đổi một phần sự gọn gàng để lấy các kênh khớp thẳng với những câu hỏi người ta thật sự hỏi về một màu — sáng cỡ nào, rực cỡ nào, tông gì — và đó cũng là lý do phần lớn hệ thống thiết kế xuất biến số theo đúng dạng này: một token như --brand-l: 47% chỉnh được riêng lẻ mà không ai phải tính lại đỏ, xanh lá, xanh dương bằng tay.

Câu hỏi thường gặp

Công thức đổi RGB sang HSL là gì?
Độ sáng là trung bình cộng của kênh lớn nhất và kênh nhỏ nhất. Độ bão hòa so sánh khoảng cách giữa kênh lớn nhất và nhỏ nhất với việc độ sáng đó gần trung tâm ra sao. Tông màu nhìn vào kênh nào lớn nhất, rồi xem hai kênh còn lại nghiêng về đâu so với khoảng cách giữa lớn nhất và nhỏ nhất, quy đổi thành một vị trí trên bánh xe 360 độ.
Có cần đổi qua hex trước rồi mới ra HSL không?
Không — hex và HSL đều được tính độc lập từ RGB. Công cụ này đi thẳng từ RGB sang HSL, không qua bước hex ở giữa, và gõ thẳng số RGB thường nhanh hơn là đổi ra hex bằng tay trước.
Vì sao rgb(0, 31, 63) chỉ có 12% độ sáng?
Độ sáng là trung bình cộng của kênh cao nhất và thấp nhất, quy ra phần trăm. Ở đây kênh cao nhất là xanh dương với 63, kênh thấp nhất là đỏ với 0; trung bình là 31,5, tức khoảng 12% của 255 — đúng là tối, vì mọi kênh đều là số nhỏ.
Một màu không phải đỏ, xanh lá hay xanh dương thuần có thể đạt 100% bão hòa không?
Có. rgb(142, 68, 173) là một màu tím trầm, không phải màu gốc, và chỉ đạt khoảng 44% bão hòa, thấp hơn 100% khá nhiều — nhưng một màu như rgb(0, 31, 63) lại đạt đúng 100%, vì độ bão hòa phụ thuộc vào độ chênh lệch tương đối giữa các kênh ở độ sáng đó, không phụ thuộc màu gốc nào đang tham gia.
Khi hai kênh cùng bằng giá trị lớn nhất thì tông màu tính sao?
Màu đó rơi đúng vào ranh giới giữa hai vùng tông màu — ví dụ lục lam (180°) khi xanh lá và xanh dương bằng nhau và cùng lớn hơn đỏ. Công thức chọn một phía nhất quán, không có gì mơ hồ, nên tông màu vẫn ra chính xác, không phải số trung bình hay ước lượng.
Tông màu trong HSL có phải con số mà thanh trượt hue trên color picker dùng không?
Đúng, đây là định nghĩa chuẩn của CSS và các công cụ thiết kế: 0–360 độ quanh một bánh xe cố định, đỏ ở 0, xanh lá ở 120, xanh dương ở 240. Thanh trượt hue trên color picker và kết quả tông màu của công cụ này luôn mô tả cùng một bánh xe.