重构颜色混合逆运算函数:计算与给定颜色混合后得到目标结果色的对应颜色
重构颜色混合逆运算函数:计算与给定颜色混合后得到目标结果色的对应颜色
嘿,我完全懂你的需求!你手里的这个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




