青训营X豆包MarsCode 技术训练营题目解析——RGB色值转换为整数值| 豆包MarsCode AI 刷题

98 阅读3分钟

RGB 转十六进制整数值问题解析

1. 背景知识

RGB颜色表示法将颜色分为三部分:

  • R(红色)
  • G(绿色)
  • B(蓝色)

每个部分的值范围为 00 到 255255,代表该颜色分量的强度。

2. 十六进制颜色表示法

RGB颜色可以用一个整数表示,遵循以下公式:

整数值=R×2562+G×256+B\text{整数值} = R \times 256^2 + G \times 256 + B

对应位移的方式为:

  • R 值位于高 16 位,用 R×2562R \times 256^2 或 R≪16R \ll 16 表示。
  • G 值位于中间 8 位,用 G×256G \times 256 或 G≪8G \ll 8 表示。
  • B 值位于低 8 位,用 BB 表示。

例如,颜色 (192,192,192)(192, 192, 192) 的转换过程:

整数值=(192≪16)+(192≪8)+192=12632256\text{整数值} = (192 \ll 16) + (192 \ll 8) + 192 = 12632256


3. 解题思路

将给定的 RGB 字符串(如 rgb(192, 192, 192))解析为整数,分为以下几步:

  1. 提取 RGB 值: 从字符串中提取 RR、GG、BB 值。

    • 去掉 rgb(),用逗号分隔提取分量。
  2. 数据类型转换: 将分量的字符串转换为整数。

  3. 位移计算: 根据公式将 RR、GG、BB 值拼接成一个整数。


4. 代码详解

def solution(rgb):
    # 1. 从字符串中提取 RGB 值
    # 去掉 "rgb(" 和 ")",然后用逗号分割字符串
    rgb_values = rgb[4:-1].split(',')
    
    # 2. 去掉空格并将字符串转换为整数
    r = int(rgb_values[0].strip())  # 红色分量
    g = int(rgb_values[1].strip())  # 绿色分量
    b = int(rgb_values[2].strip())  # 蓝色分量
    
    # 3. 计算对应的整数值
    # R 左移 16 位,G 左移 8 位,B 不移动
    integer_value = (r << 16) + (g << 8) + b
    
    return integer_value

5. 运行示例

输入:rgb = "rgb(192, 192, 192)"
  1. 提取 RGB 值:

    • 去掉 rgb(),得到 192, 192, 192
    • 用逗号分割并去空格,结果为 [192,192,192][192, 192, 192]。
  2. 转换为整数:

    • R=192,G=192,B=192R = 192, G = 192, B = 192。
    • 计算整数值: (192≪16)+(192≪8)+192=12632256(192 \ll 16) + (192 \ll 8) + 192 = 12632256
  3. 输出:

    • 返回 1263225612632256。
输入:rgb = "rgb(100, 0, 252)"
  1. 提取 RGB 值:

    • 去掉 rgb(),得到 100, 0, 252
    • 结果为 [100,0,252][100, 0, 252]。
  2. 转换为整数:

    • R=100,G=0,B=252R = 100, G = 0, B = 252。
    • 计算整数值: (100≪16)+(0≪8)+252=6553852(100 \ll 16) + (0 \ll 8) + 252 = 6553852
  3. 输出:

    • 返回 65538526553852。

6. 测试用例与边界值

测试用例:
  • 输入rgb = "rgb(255, 255, 255)"
    输出:1677721516777215 (白色,最高值)。
  • 输入rgb = "rgb(0, 0, 0)"
    输出:00 (黑色,最低值)。
边界值:
  • 确保输入始终为合法 RGB 格式。
  • 如果输入不符合规范(如缺少括号或分量超范围),需要额外的校验。

7. 总结

  • 核心知识: 了解 RGB 转十六进制整数的位移计算原理。
  • 代码实现: 使用简单的字符串处理和位移操作,确保效率和正确性。
  • 意义: 这种操作常用于颜色处理,适用于前端界面开发、图像处理等领域。