python-3.x - 如何在 python 中生成颜色模式/渐变?
问题描述
我正在根据范围设置颜色值0 to 100 (red to green)
到目前为止,一个简单的片段
value = 5
colour = ""
if value <= 25:
colour = "#FF0000" # red
elif value > 25 and value <= 50:
colour = "FF8000" # orange
elif value > 50 and value <=75:
colour = "#FFFF00" # yellow
elif value > 75 and value < 100:
colour = "#53d926" # light green
是否可以自动设置颜色(gradient pattern, from red > orange > yellow > not complete green)?
为 100 表示完全成功(绿色)。
现在只有四种颜色。但是基于不同的百分比,它应该为任何value (combination of colours from red > orange > yellow > not complete green, with respective to values)
聪明的方法来相应地设置颜色来处理这个?
解决方案
看来您有 5 个定义明确的点,并且您希望它们之间的值具有平滑的渐变。
- 0:红色。
- 25:橙色
- 50:黄色
- 75:浅绿色
- 100:绿色
您可以使用线性插值来获取这些定义点之间的颜色。例如,恰好在两点之间的值就是这两种颜色的平均值。下面的函数lerp
提供了这一点。
def all_channels2(func):
def wrapper(channel1, channel2, *args, **kwargs):
try:
return func(channel1, channel2, *args, **kwargs)
except TypeError:
return tuple(func(c1, c2, *args, **kwargs) for c1,c2 in zip(channel1, channel2))
return wrapper
@all_channels2
def lerp(color1, color2, frac):
return color1 * (1 - frac) + color2 * frac
以下是您将如何使用它:
def hexcolor(rgb):
return f'#{int(rgb[0]):0>2X}{int(rgb[1]):0>2X}{int(rgb[2]):0>2X}'
if value < 25:
colour = hexcolor(lerp((0xff, 0x00, 0x00), (0xff, 0x80, 0x00), value / 25))
elif value < 50:
colour = hexcolor(lerp((0xFF, 0x80, 0x00), (0xFF, 0xFF, 0x00), (value - 25) / 25))
elif value < 75:
colour = hexcolor(lerp((0xFF, 0xFF, 0x00), (0x53, 0xd9, 0x26), (value - 50) / 25))
else:
colour = hexcolor(lerp((0x53, 0xd9, 0x26), (0x00, 0xff, 0x00), (value - 75) / 25))
推荐阅读
- android - 获取活动在分屏中的位置
- domain-driven-design - 我如何使用 Axon 使用相同的第一个 InitAvailableQuantityCommand 重新初始化某些值?
- python-3.x - LSB 隐写术 - 解码功能错误
- php - Sql 查询计算性能
- json - VBA 中的嵌套 JSON。无法访问值
- c# - C#在标签内将返回的参数显示为十进制
- autocomplete - ReactiveSearch 查询和结果行为
- nativescript - NativeScript 是否支持 npm 链接或符号链接模块?如果不是,那么有什么替代方案?
- javascript - JavaScript 正则表达式字符串替换导致“$ 1”而不是单词
- vuejs2 - 如何从 VTextField 扩展?