You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

重构颜色混合逆运算函数:计算与给定颜色混合后得到目标结果色的对应颜色

重构颜色混合逆运算函数:计算与给定颜色混合后得到目标结果色的对应颜色

嘿,我完全懂你的需求!你手里的这个combine_hex_values函数本质是把两个十六进制颜色的RGB分量各自取平均,然后拼接成新的混合色。现在你需要的是它的逆运算:已知混合后的结果色,再给其中一个原始颜色,算出另一个能和它混合出目标色的颜色,对吧?

先拆解下原函数的逻辑,帮你理清楚逆运算的推导基础:

  • 原函数接收的字典d里应该包含两个6位十六进制颜色码(因为总权重tot_weight固定为2)
  • 它把每个颜色拆成红(前两位)、绿(中间两位)、蓝(后两位)三个分量,转成十进制后求和再除以2,得到混合后的RGB分量
  • 最后把十进制分量转回十六进制,不足两位补零,拼接成最终的混合色

逆运算推导&边界处理

根据原函数的平均逻辑,我们可以推导出逆运算公式:
假设混合后的结果色分量为R_result, G_result, B_result,已知的原始颜色分量为R_known, G_known, B_known,那么未知的原始颜色分量为:

R_unknown = 2 * R_result - R_known
G_unknown = 2 * G_result - G_known
B_unknown = 2 * B_result - B_known

这里要注意:RGB分量的取值范围是0-255,所以计算出来的结果如果小于0,要强制设为0;如果大于255,就设为255,避免出现无效的颜色值。

逆运算函数实现

下面是实现好的Python函数,和原函数的风格保持一致:

def reverse_combine_hex(target_hex, known_hex):
    # 解析目标结果色的RGB分量
    target_r = int(target_hex[:2], 16)
    target_g = int(target_hex[2:4], 16)
    target_b = int(target_hex[4:6], 16)
    
    # 解析已知颜色的RGB分量
    known_r = int(known_hex[:2], 16)
    known_g = int(known_hex[2:4], 16)
    known_b = int(known_hex[4:6], 16)
    
    # 计算未知颜色的RGB分量,处理边界
    unknown_r = max(0, min(255, 2 * target_r - known_r))
    unknown_g = max(0, min(255, 2 * target_g - known_g))
    unknown_b = max(0, min(255, 2 * target_b - known_b))
    
    # 十六进制格式化,补零
    zpad = lambda x: x if len(x)==2 else '0' + x
    return zpad(hex(unknown_r)[2:]) + zpad(hex(unknown_g)[2:]) + zpad(hex(unknown_b)[2:])

测试示例

比如用原函数测试:

# 原函数输入两个颜色:纯红(FF0000)和纯绿(00FF00)
print(combine_hex_values({"FF0000": 1, "00FF00": 1}))  # 输出 808000

用逆运算函数验证:

# 已知目标色808000,已知颜色FF0000,求另一个颜色
print(reverse_combine_hex("808000", "FF0000"))  # 输出 00ff00,和原输入一致

备注:内容来源于stack exchange,提问作者Kirill Krutelev

火山引擎 最新活动