在颜色的实际使用中,通过更改颜色的色相值改变图片的颜色是常用的方法。
通过更改纯色的色相值称为纯色的偏转,例如:纯色(255,0,0)顺时针偏转60就得到纯色(255,255,0),逆时针偏转60得到纯色(255,0,255)。
那么纯色(255,44,0)顺时针偏转127得到什么颜色呢?下面的文章就是讲述计算方法。
在“计算机中的颜色V——快速计算颜色的色相值”中,纯色的色相值H的计算公式为:
当G≥B时,H=(255-R+G+B)/255×60 公示1
当G<B时,H=360-(255-R+G+B)/255×60 公式2
令ω为偏转值,且定义正值为顺时针偏转,负值为逆时针偏转,ω的取值范围为[-180,180]
则偏转后的颜色的色相值H'=H+ω,此时H'有一个溢出的问题。后文再讨论。
计算纯色的关键就在于纯色和红色的夹角θ,当H<180,θ=H;当H>180,θ=360-H
结合公式1和公式2,可知θ=(255-R+G+B)/255×60
偏转后的纯色和红色的夹角θ’=θ+ω,此时的ω和上文的ω有一定的区别,在六色环的右边,定义和上文一样;在六色环的左边,定义和上文相反,逆时针正值,顺时针负值。因为六色环左右对称的缘故。
λ’=θ’/60×255=(θ+ω)/60×255=[(255-R+G+B)/255×60+ω]/60×255=255-R+G+B+ω/60×255
令ω’=ω/60×255,则λ’=255-R+G+B+ω’
再考虑λ’的溢出问题,
当λ’<0时,说明,偏转后的颜色跨越了左右分区(注:在上文中,实际颜色分为左右两个分区)。此时,令λ’’=-λ’
当λ’>765时,也说明偏转后的颜色跨越了左右分区。此时,令λ’’=1530-λ’
否则λ’’=λ’
则偏转后的纯色(R’,G’,B’)
R’=510-λ’’;若R’<0,则R’=0;若R’>255,则R’=255;
G’=λ’’;若G’>255,则G’=255;
B’=λ’’-510;若B’<0;则B’=0;
若偏转后的颜色在左半区,那么交换G’,B’
如何判断偏转后的颜色在左半区,而要交换G’,B’?
对于G≥B,原色在右半区,那么当出现跨越分区的情况。偏转后的纯色在左半区。就是λ’<0或λ’>765
对于G<B,原色在左半区,那么当没出现跨越分区的情况。偏转后的纯色在左半区。就是0≤λ’≤765
这两种情况,有没有统一的表述公式呢?
当(G<B)XOR(λ’<0或λ’>765)表达式为TRUE时,要交换G’,B’
XOR表示异或运算,两个逻辑表达式为一真一假时,得到TRUE,反之得到FALSE
好,把上面的推理过程梳理一下。纯色(R,G,B)偏转ω后,如何计算偏转纯色(R’,G’,B’)
当G<B时,ω=-ω
ω’=ω/60×255
λ’=255-R+G+B+ω’
当λ’<0时,令λ’’=-λ’
当λ’>765时,令λ’’=1530-λ’
否则λ’’=λ’
偏转纯色的分量
R’=510-λ’’;若R’<0,则R’=0;若R’>255,则R’=255;
G’=λ’’;若G’>255,则G’=255;
B’=λ’’-510;若B’<0;则B’=0;
若(G<B)XOR(λ’<0或λ’>765)=True时,交换G’,B’分量的值
(255,44,0)顺时针偏转127得到什么颜色呢?答案是(0,255,74)
(255,44,0)逆时针偏转127得到什么颜色呢?答案是(14,0,255)