在两种颜色之间生成一系列颜色
平面设计
颜色
颜色理论
2022-01-25 15:20:00
4个回答
看看这个答案。如何使给定的颜色更深或更浅?
您只需获取每个 RGB 组件的分离值并将这些值相除。
但是我们有一个问题,进行颜色转换的方法不止一种。
第一种方法会给你最短的路线(1),但这条路线可能不是你需要的。
这也受颜色模型或逻辑的影响。例如,在 Lab* 颜色模型中,红色和绿色是互补色,因此该模型上的短路径将通过中性灰色 (3)。
如果您只需要一种颜色的深浅,另一个答案是合适的。
这称为颜色插值。这就是渐变在幕后所做的。您可以使用多种方式和方法来完成此操作,而结果的准确插值方式取决于方法。
我通常为使用 JavaScript 的 Web 项目执行此操作,以便我可以动态更改颜色,例如在这个音乐可视化器中。从上面的示例中提取的具有非常简单的使用 RGB 的线性插值方法的 JavaScript 实现如下:
现场演示
// Returns a single rgb color interpolation between given rgb color
// based on the factor given; via https://codepen.io/njmcode/pen/axoyD?editors=0010
function interpolateColor(color1, color2, factor) {
if (arguments.length < 3) {
factor = 0.5;
}
var result = color1.slice();
for (var i = 0; i < 3; i++) {
result[i] = Math.round(result[i] + factor * (color2[i] - color1[i]));
}
return result;
};
// My function to interpolate between two colors completely, returning an array
function interpolateColors(color1, color2, steps) {
var stepFactor = 1 / (steps - 1),
interpolatedColorArray = [];
color1 = color1.match(/\d+/g).map(Number);
color2 = color2.match(/\d+/g).map(Number);
for(var i = 0; i < steps; i++) {
interpolatedColorArray.push(interpolateColor(color1, color2, stepFactor * i));
}
return interpolatedColorArray;
}
像这样使用它并返回一个插值颜色的数组:
var colorArray = interpolateColors("rgb(94, 79, 162)", "rgb(247, 148, 89)", 5);
您还可以找到用于进行颜色插值的 PhotoShop(以及可能的其他程序)扩展。
但是,您可能需要检查以确保插值方法与您想要的方法相同,因为您可以使用任何函数和颜色系统进行插值。有关我的意思的更多信息,请参阅Rafael 的回答。此外,这是一个使用几种不同方法生成渐变的工具,可以说明差异。
其它你可能感兴趣的问题