RGB 转 Hex 颜色转换
实现 RGB 颜色值到十六进制颜色的转换
问题
实现一个函数,将 RGB 颜色值转换为 Hex 十六进制格式。
例如:rgb(255, 165, 0) 转换为 #ffa500
解答
基础实现
function rgbToHex(r, g, b) {
// 将单个颜色值转为两位十六进制
const toHex = (n) => {
// 确保值在 0-255 范围内
const hex = Math.max(0, Math.min(255, n)).toString(16);
// 不足两位补 0
return hex.padStart(2, '0');
};
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
}
// 测试
console.log(rgbToHex(255, 165, 0)); // #ffa500
console.log(rgbToHex(0, 0, 0)); // #000000
console.log(rgbToHex(255, 255, 255)); // #ffffff
位运算实现
function rgbToHex(r, g, b) {
// 将 RGB 合并为一个数字,再转为十六进制
// r 左移 16 位,g 左移 8 位,b 不移动
const hex = ((r << 16) | (g << 8) | b).toString(16);
// 补足 6 位
return '#' + hex.padStart(6, '0');
}
console.log(rgbToHex(255, 165, 0)); // #ffa500
解析 RGB 字符串
function rgbStringToHex(rgbString) {
// 匹配 rgb(r, g, b) 格式
const match = rgbString.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
if (!match) {
throw new Error('Invalid RGB format');
}
const [, r, g, b] = match.map(Number);
return rgbToHex(r, g, b);
}
console.log(rgbStringToHex('rgb(255, 165, 0)')); // #ffa500
支持 RGBA
function rgbaToHex(r, g, b, a = 1) {
const toHex = (n) => Math.max(0, Math.min(255, n)).toString(16).padStart(2, '0');
// alpha 转为 0-255 范围
const alphaHex = toHex(Math.round(a * 255));
return `#${toHex(r)}${toHex(g)}${toHex(b)}${alphaHex}`;
}
console.log(rgbaToHex(255, 165, 0, 0.5)); // #ffa50080
关键点
- RGB 每个通道值范围是 0-255,对应十六进制 00-ff
toString(16)将数字转为十六进制字符串- 使用
padStart(2, '0')确保每个颜色值占两位 - 位运算方式更简洁:
(r << 16) | (g << 8) | b - 处理边界值,确保输入在有效范围内
目录