【发布时间】:2020-06-09 15:02:09
【问题描述】:
所以我正在尝试制作一个颜色渐变,从一种颜色到全黑,以及从一种颜色到全白。
假设我有(175, 250, 255),我想将该颜色变暗 10 次以在(0, 0, 0) 结束,我该怎么做?
我还想把颜色调亮,所以我想调亮10次,最后在(255, 255, 255)结束。
【问题讨论】:
所以我正在尝试制作一个颜色渐变,从一种颜色到全黑,以及从一种颜色到全白。
假设我有(175, 250, 255),我想将该颜色变暗 10 次以在(0, 0, 0) 结束,我该怎么做?
我还想把颜色调亮,所以我想调亮10次,最后在(255, 255, 255)结束。
【问题讨论】:
也许用户 Peter O 对同一问题的接受回答会有所帮助:Given an RGB value, how do I create a tint (or shade)?。
在着色和着色的几个选项中:
对于阴影,将每个分量乘以它的 1/4、1/2、3/4 等 以前的值。系数越小,阴影越深。
对于色调,计算(255 - 前一个值),乘以 1/4, 1/2、3/4 等(系数越大,色调越淡),并添加 到前一个值(假设 each.component 是 8 位 整数)。
请注意,颜色处理(例如色调和其他阴影)应该 在线性RGB中完成。但是,文档中指定的 RGB 颜色或 在图像和视频中编码不太可能是线性 RGB,在 在这种情况下,需要应用所谓的逆传递函数 到每个 RGB 颜色的组件。此功能随 RGB 颜色空间。例如,在 sRGB 颜色空间中(可以是 假设如果 RGB 颜色空间未知),这个函数大致是 相当于提升每个 sRGB 颜色分量(范围从 0 通过 1) 的 2.2 次方。 (请注意,“线性 RGB”不是 RGB 色彩空间。)
另请参阅 Violet Giraffe 关于“伽马校正”的评论。
【讨论】:
解决这个问题的方法很多。一种想法是找出当前值与目标值之间的差异,然后除以 10。
所以(175, 250, 255) 到(0, 0, 0) 的差是(175, 250, 255),然后将其除以十得到你要减去十步中的每一步的结果。所以每一步减去(-17.5, -25, -25.5),需要时四舍五入。
【讨论】:
你能把每个值减少 10% 十次吗? 例如,您的颜色将是:
175 250 255
157 225 229
140 200 204
122 175 178
105 150 153
87 125 127
70 100 102
52 75 76
35 50 51
17 25 25
0 0 0
【讨论】:
可能是这样的:
def interpolate(color_a, color_b, t):
# 'color_a' and 'color_b' are RGB tuples
# 't' is a value between 0.0 and 1.0
# this is a naive interpolation
return tuple(int(a + (b - a) * t) for a, b in zip(color_a, color_b))
def main():
color_a = (175, 250, 255)
color_b = (0, 0, 0)
number_of_steps = 10
colors = [interpolate(color_a, color_b, t/number_of_steps) for t in range(number_of_steps+1)]
for color in colors:
print(color)
return 0
if __name__ == "__main__":
import sys
sys.exit(main())
输出:
(175, 250, 255)
(157, 225, 229)
(140, 200, 204)
(122, 175, 178)
(105, 150, 153)
(87, 125, 127)
(70, 100, 102)
(52, 75, 76)
(35, 50, 51)
(17, 25, 25)
(0, 0, 0)
【讨论】:
number_of_steps+1)。不确定“将颜色变暗 10 次”是否还应该包括开始和结束颜色(包括开始和结束颜色的 10 种,或者介于两者之间的 10 种阴影?)。不过,根据您的需要进行修改应该不难。