前一篇文章中介绍了关于Processing中颜色的灰度表示法,颜色透明度,以及RGB彩色表示,然而还有一些关于颜色的常用技巧,这些技巧主要是在需要颜色在时间或者空间上产生渐变的时候使用。如果你有相关的使用需求,那么不妨现在开始这新一部分的颜色学习吧:
RGB表示法的问题
我们先从下面这个绘制一堆颜色渐变的多个矩形的程序开始说起:
def setup():
size(500, 500)
N = 50
stroke(0)
for i in range(N):
for k in range(N):
fill(i*5, k*5, 30) # 为每个格子设置填充色
rect(i*10, k*10, 10, 10)
12345678
效果:

表面上看上去没什么问题,在RGB颜色的表示中,我们的矩形越向右边,R(red)值就越大,而越向下,G(green)值就越大,这样使用RGB表示和循环相结合的方式,就可以画出空间上的颜色渐变。但是,这样真的没问题吗?
并不是,仔细观察后你会发现,越靠近左上角,颜色就越“阴暗”,而越靠近右下角,颜色就越“明亮”,这样就会导致对不同位置的突出程度不一样,然而我们有些时候想要的是一种各个颜色之间“不同但平等”的效果。下面我们就解决这个问题。(在上面的程序中调大B值能够部分缓解这个问题,但是无法根本解决,有兴趣可以自行尝试~)
HSB彩色表示格式
程序例子
同样的程序,这次我们使用HSV格式进行颜色设置:
def setup():
size(500, 500)
colorMode(HSB)
N = 50
stroke(0)
for i in range(N):
for k in range(N):
fill((i-k+30)*2, 200, 200) # 为每个格子设置填充色
rect(i*10, k*10, 10, 10)
123456789
效果:

可以看到,在颜色设置格式从RGB改变成HSB后,我们仍旧尽量保持了颜色渐变方式和前面的一致(从右下角到右上角的颜色渐变)。这个时候,我们惊喜地发现,各个颜色之间“不平等”的问题被我们解决啦~
那么,HSB格式到底是何方神圣呢?
色相
HSB其实也是三个单词的缩写,分别代表了:色相,饱和度,亮度。通过单一地改变色相,就能够得到红蓝绿在内的多种颜色:
色相值在Processing中的取值是从0到255的值,如果将其转换为0-360的度数表示,就可以得到下面的结果(色相轮):

现在,这里的色相轮忽略了颜色的深浅,明亮,丰富或苍白。只知道要找到色相,请考虑色轮上最接近的任何颜色。
(“但是黑色?白色?灰色吗?” –稍等,天才。我们一会儿会到达那里的。)
如果您想对HSB有一个直观的了解,则应牢记几个锚点。我使用红色,绿色和蓝色,因为它们在圆上等距分布:
红色为0°
绿色为120°
蓝色为240°
红色也是360°,与0°时候的效果完全相同
因此,当我考虑添加什么颜色时,只要考虑一下这三个点,就可以快速键入一个使我非常接近正确色相的数字。
饱和度
饱和度是介于0到100之间的数字。因此,无论您选择了哪种色调,饱和度为100%将是该颜色的最丰富版本:

亮度
亮度是介于0到100之间的数字。像饱和度一样,它有时以百分比表示。就其含义而言,这一点相当明显,但是有一个快速的认识。
0%的亮度是黑色,无论色相还是饱和度。
仅当饱和度也为0%时,100%的亮度才为白色。否则,100%的亮度只是一种……非常明亮的颜色。
听起来令人困惑?这样想吧。想象亮度是一个灯泡。0%表示灯泡熄灭(房间内的灯黑)。100%表示光线已满。因此,100%的亮度是较为明亮的颜色,而如果光线已经是白色,则100%的亮度是纯白色。

HSB总结
因此,在HSB格式中,我们可以用三个有意义的数字的组合来描述一种颜色:
- 色相:色轮中对应位置的颜色
- 饱和度:注入颜色的方式
- 亮度:“灯泡”打开的程度
在Processing中,这三个值都是0到255(重要的从来不是取值范围,而是值之间的相对大小)。
通过改变色相的值,我们可以产生颜色的渐变;而改变饱和度或者亮度,则能够通过颜色表达一个形状的重要或者是不重要。
另一种方式控制渐变色:颜色插值
有时候,你想要的并不是那种彩虹色一样的颜色大集合式渐变,而是一种在一个更狭小的颜色范围内变化的渐变,这个时候,你可以从前面的HSB模式中,将色相值控制在一个较小的范围内实现这样的效果。
而另外一种效果则是颜色插值,也就是确定颜色渐变的两个渐变端点的颜色,然后根据插值确定中间颜色:
def setup():
size(500, 500)
N = 50
fromC = color(204, 102, 0) # 插值的起始颜色,RGB表示
toC = color(0, 153, 153) # 插值的终止颜色
stroke(0)
for i in range(N):
for k in range(N):
tmpC = lerpColor(fromC, toC, 1.0/60*(i-k+30)) # 颜色插值产生渐变
fill(tmpC)
rect(i*10, k*10, 10, 10)
12345678910111213
效果:

相关作品欣赏
最后,不妨一起来欣赏一个使用颜色渐变的Processing动态几何作品:
作品链接
作品截图:
